A:回答
この手の質問 quora でもよそでもわりとよく聞くんですが、言語の差っていま殆ど無いんですよマジで。
純粋に性能で比較すると rust が最速なのは間違いないですが、 普通のサーバーで普通のサービスを提供する限り、どれを選んでも性能不足を感じる場面はまずないと言って良いでしょう。
将来性については、いま最新を使えばどれも3年は確実に使えます。アップデートのメンテコストをかけるつもりがあれば5年も余裕です。一方で、あなたが作ったサービスが3年後も生きてる可能性はわりと低いです。そんなことない?そりゃすみません。
エコシステムが充実しててサンプルコードが多いのは python になりますかねえ。最新の python なら型も書けますし。
nodejs はどうなんかねー、ブラウザが import をサポートしたので babel & webpack が要らなくなり、import の拡張子の問題で typescript と node の仕様がweb標準と合わなくて揉めてるのが2022年。この変更はエコシステムの破壊をもたらすのでわりとデカい話です。もうあらゆる面で Deno の方が良いのに人類が nodejs にしがみついているので私は軽く絶望しています笑
go は私はあんま書く気無いですがファンは多いので10年は続くでしょう、私も強く反対はしません。
rust は最高オブ最高。「難しい」という印象が先行してますが、これがそんなに難しく見えますか?
- use actix_web::{get, post, web, App, HttpResponse, HttpServer, Responder};
- #[get("/")]
- async fn hello() -> impl Responder {
- HttpResponse::Ok().body("Hello world!")
- }
- #[post("/echo")]
- async fn echo(req_body: String) -> impl Responder {
- HttpResponse::Ok().body(req_body)
- }
- async fn manual_hello() -> impl Responder {
- HttpResponse::Ok().body("Hey there!")
- }
基本的にWebAPIはHTTP通信やDBとのやり取りなどのIOが主なボトルネックですので非同期処理に対応していることが重要です。FastAPIでは従来のPythonの標準的なWSGIではなく、非同期処理に対応したASGIに準拠している点がFlaskなどとの大きな違いです。内部でStartletteを利用し、ASGIの実行環境としてUvicornを使用するなどの点は他の回答の通りです。
もちろんちゃんとASGIの利点を生かすためにはasync defを使用して関数を定義し、IO処理ではasync/awaitをしっかり利用することが不可欠です。DBとの接続も非同期処理に対応したものを使用する必要があります
。しかし、それでもnodejsやGo並みというのはかなり盛っているといわざるを得ません。マイクロベンチマークでいくら速くても言語レベルで非同期前提のそれらの言語と比べると必ず様々なオーバーヘッドが出てきます。ただ、FlaskなどのWSGIの時代と比べるとはるかに進化しているということは確実です。
私が思うにFastAPIの一番の売りはPythonのType Hintを実際にデータのバリデーションに使用したり、OpenAPIドキュメントの自動生成に活用しているという点です。特に後者については同等の機能を有した他言語のフレームワークをいまだに見たことがなく、私はAPIサーバーを作る場合は第一候補は必ずFastAPIです。
脚注
どっちも使ってます。
Djangoのテスト環境含めたサポートは中規模からは重宝します。
FastAPIはお手軽なのでAPIをとりあえず提供するには簡単なので使ってます。その代わりORMとかはないので別途提供するので面倒ですが。
ということで、どっちもどっちなので両方使えば良いのでは。
APIというのはWeb APIサーバーのことですね。
GoかPythonのFastAPIを推します。
C++とRustは確かにGoよりも速いですが、それはあくまでCPU boundな処理の場合であってWebAPIのようにIO boundの場合にはそれほど優位ではありません。
Rubyはどんどん利用者が減っていっている言語です。PHPだったら迷います。
Scalaは以前はPlay Frameworkが一時期流行った気もしますが、なんだかんだJVM系はやっぱりJavaが一番強くてSpring Frameworkが多いようです。
Goは静的型付け言語ですが,PythonもType HintとMypyを組み合わせればほぼ静的型付け言語並みの方チェックができます。そしてなんといってもFastAPIが素晴らし過ぎます。
本当にパフォーマンスが要求される場合はGo、それ以外のほとんどの場合はPython+FastAPIです。
関連回答
この場合であれば、Python(fastapi)またはGo langがおすすめですね。
バックエンドの開発であれば型があった方が嬉しいのでそういった所からGoが一番良いかと思いますが、Pythonには型アノテーションがあるので擬似的にではありますが、型のようなものを用意して開発する事はできます。
この2つの理由からPythonとGo langはオススメですね。C++, Rustに関しては型はありますがそれ以上にメモリ周りの事を気にしないといけないので、この中でどれを選びますか?と言われた場合であれば優先して選びたい理由はあまりないです。
また、ScalaにしろRuby(on rails)にしろ、PythonやGo langで書く選択肢があるならばわざわざ選ぶ動機はあまりないのかなぁと思いました。
選択肢に出てきていないもので恐縮ですが、こういった並びにされるのであればNode.jsで書くのもアリかと思います。フロントエンドではどうせJS/TSを使わないといけないので、APIを作るという状況下においてフロントの開発もある程度必要になるケースがある事を考えると、Node.jsもPythonやGo langに並んで有力な候補になるかと思います。
一般にDjangoのようなフルスタックフレームワークは他のやり方、例えばDDD(ドメイン駆動設計)とは相性が悪いです。
無理に入れようとすると屋上屋を架すようなやり方になるか、Djangoの強みが台無しになり、最初から他のマイクロフレームワークでいいじゃんとなります。
あと、Djangoはまだ非同期対応が十分でなく、型ヒント対応もイマイチです。APIを使うときはFastAPIを使う方がいいでしょう。
とは言え慣れているに越したことはないので、まずはDjangoでやってみるのもアリだと思います。
Python はあまり詳しくないですが、私の勘は「No」と言っています。
Apache は本来は html や画像ファイルなど、ファイルそのものを http で返すためのもので、その置き場が /var/www 以下です。なので、普通に考えると標準的な設定で python のファイルをそこに置いたら python のソースコードをそのままブラウザに返すことになります。(業務でこれやったら事故です)
Apache に python 実行用の modを乗せて cgi として動かすんですかね?その場合、 cgi の起動ファイルは www 以下に置くことになると思いますが、そこから参照する python ファイルはすべて www の外に置くべきですね。FastAPI をCGI起動するのもなかなかトリッキーな感じですが。。
ふつう、 FastAPI のアプリを起動する場合は apache を使わずに uvicorn のようなASGI サーバを使うんではないでしょうか。
さらに前面に apache を立たせるケースもあるようですが、 apache uvicorn 間はソケット通信するだけなので、 python ファイル群はどこにあってもよく、一般に www 以下は避けるかと思われます。
まともな回答がなかったのでとりあえず書きましたが、あとはパイソニスタの人頼む。
向いていると思います。
他の回答に挙げられている問題点としては動的型付けであることとパフォーマンスですが、FastAPIはそれらもしっかり考慮されています。
まずパフォーマンスについてはFastAPIは従来のWSGIではなくてASGIという非同期処理に対応した新しいPythonのWebAPI仕様に則っていてasync/await構文をしっかり理解して使用し、DBコネクタ関連もasyncio対応の物に置き換えればGoやNodejsレベルとは言いませんが十分に高速に動作します。DjangoやFlaskなどの従来のWSGIよりかは全然速い。ベンチマークの取り方に依存しますが、非同期処理を正しく書ければ10倍はでます。
動的型付けの件についてはFastAPIと内部で利用しているPydanticはPython 3.5から登場したtype hinting機能をエディタの補完補助にとどまらず、積極的に機能として利用していて自動的にリクエストパラメータのvalidationやドキュメント(OpenAPI)の自動生成が可能になっています。特に後者のOpenAPIドキュメント生成は他のフレームワークには見られない機能でこれだけでも採用する価値があると思います。
後発であることがゆえに採用例や情報が少ないというのが懸念になるかもしれませんが、FastAPIは公式サイトのドキュメントが完璧に整備されており、英語はもちろん、日本語でもすでに多くの紹介記事があります。Microsoft, Uber, Netflixなどの一流テック企業も採用しています。
Opinions¶
"[...] I'm using FastAPI a ton these days. [...] I'm actually planning to use it for all of my team's ML services at Microsoft. Some of them are getting integrated into the core Windows product and some Office products."
Kabir Khan - Microsoft
"We adopted the FastAPI library to spawn a REST server that can be queried to obtain predictions. [for Ludwig]"
Piero Molino, Yaroslav Dudin, and Sai Sumanth Miryala - Uber
"Netflix is pleased to announce the open-source release of our crisis management orchestration framework: Dispatch! [built with FastAPI]"
Kevin Glisson, Marc Vilanova, Forest Monsen - Netflix
Djangoを勧める回答が多いですが、フルスタックフレームワークはブラックボックスな部分が多くて初学者にはお勧めしません。また、近年ではReactなどのSPAを利用するケースが増えてきていますのでサーバー側はテンプレートエンジンなど使用せずにAPIに徹するというのがいいと思っています。そこで私が一番お勧めするのはFlask
に代わって期待されているFastAPIです。このFastAPIはWSGIに代わる、ASGIという非同期処理のPythonのWebappの仕様に対応していてその名の通りとてもパフォーマンスが高いのですが、そんなことよりも素晴らしいのはPythonの型を存分に活かしている点です。
公式Webのコードを引用します。
- from typing import Optional
- from fastapi import FastAPI
- app = FastAPI()
- @app.get("/")
- def read_root():
- return {"Hello": "World"}
- @app.get("/items/{item_id}")
- def read_item(item_id: int, q: Optional[str] = None):
- return {"item_id": item_id, "q": q}
このように一見Flaskとほとんど同じ書き方なのですが、注目するポイントは関数の引数に型情報を付けてあげると自動的にHTTPリクエストのパラメータのvalidationにも適用されるという点です。例えばこの例では`item_id: int`となっていますので `GET /items/1` は有効ですが `GET /items/item1` というリクエストが来ると自動的に422エラーになってitem_idの型が違うというメッセージがクライアントに返されます。
- GET /items/item1 HTTP/1.1
- HTTP/1.1 422 Unprocessable Entity
- content-length: 104
- content-type: application/json
- date: Wed, 19 May 2021 00:42:29 GMT
- server: uvicorn
- {
- "detail": [
- {
- "loc": [
- "path",
- "item_id"
- ],
- "msg": "value is not a valid integer",
- "type": "type_error.integer"
- }
- ]
- }
この型チェックはpathパラメータだけでなく、query, form, bodyのjsonすべてに対して適用可能です。しかも、なんとこれらの情報を利用して自動でOpenAPIのドキュメントまで生成してくれます。
それ以外にもやはり新しいだけあって非常に設計が良くなされており、まだまだ比較的新しいのですが、すでにWeb上に日本語の記事がいくつも上がっていてその注目度の高さがうかがえます。
脚注
FastAPI という新星をあえてお勧めします。
Alternatives, Inspiration and Comparisons
を読むと分かりますが、Pythonの過去のあらゆるWeb関連のライブラリを研究しており、まさにstate of the artと呼べるものだと思います。今後Flaskに代わってPythonのWebフレームワークのトップになると思っています。
私が一番好きな機能はドキュメントの自動作成機能です。
A2A
フルスタックフレーム自体があまり好きではありません。覚えることが多すぎなうえ、ちょっと違うことをやりたいと思ったときにフレームワーク自体を改造しないといけないことがあったからです。今はフロントはスマホとwebで別々に使うことも多いのでテンプレートエンジンとかも邪魔なだけです。
フルスタックでなくてもいいのなら好きなのはシンプルかつエレガントなPythonのFastAPI
とGolangのEcho です。とくにFastAPIのドキュメント自動生成は便利です。脚注
普段Pythonばっかり書いているにもかかわらず静的が好きです。
言葉悪いですが、動的のメリットって手抜きして書ける点以外に見当たらないんですよね。それも最近はC++やJavaなどでも型推論が賢くなってきているのでほとんど優位でなくなってきています。
普段動的型の言語で書く際にも結局は関数の引数や戻り値の型は必ずいくつかの種類に限定しますよね。というか大抵は一種類に固定です。静的型言語でしたら引数や戻り値の型と名前を見るだけでその意味がおおよそ分かります。一方で動的の場合は型の情報が落ちているのでその分ドキュメントなどで補わなければなりません。結局書く分量はあまり変わらず、型のチェックができない分だけ損です。
そういった背景もあってTypescriptが登場したり、あるいはPythonにもType Hintingが追加されたのだと思います。
ちなみにPythonのType Hintingは最初はIDEのコード補完やmypyなどによる型チェックのための物でしたが、最近はFastAPIなどのようにむしろ積極的にこの情報を利用して挙動を変えたりするフレームワークも登場しています。Pythonはどんどん静的型言語になっているいんですよw。
Path Parameters - FastAPI (型情報によって挙動が変わる例)
0 コメント:
コメントを投稿