web-dev-qa-db-ja.com

APIのポーリングの代替手段

メッセージング機能を備えたアプリのAPIのクライアントとして機能するデスクトップアプリケーション(おそらくWinForms)があるとします。このAPIには、メッセージのJSONを返すエンドポイントと、誰が送信したか、どこに送信したかが含まれます。メッセージング機能をアプリケーションに実装することで、メッセージをリアルタイムで、またはその近くで送受信できます。

APIを毎秒ポーリングすることは、これを達成するための良い方法ですか?このリンクによると: https://medium.com/tinder-engineering/how-tinder-delivers-your-matches-and-messages-at-scale-504049f22ce 、Tinderでもこれを行っていました。これは、このようなアプリの場合、これを回避するための原始的な方法のように思われるので、私にはかなり意外です。もしそうなら、その間に他のタスクを実行したいのであれば、このポーリングを別のスレッドで実行する最良のアプローチは何でしょうか?そうでない場合、より良い解決策は何でしょうか?このアプリケーションを後で再作成できることが望ましいJava Swing、C++ wxWidgets、またはその他のウィジェットツールキット。

2
Al2110

代替は WebSocket プロトコルです。サーバーへのオープンTCP=接続が必要であることに注意してください。これにより、同時に可能なセッションの数が制限される可能性があります(HTTPサーバーはアイドル接続を閉じることができます。必要)。

単純なHTTPサーバーでは、さまざまな負荷の下でのフェイルオーバーとスケーリングがはるかに容易になるため、WebSocketはやや好意から外れているようですが、ユーザー数が中程度の小規模なアプリケーションではうまく機能します。

1

質問のリンクでは、Tinderが使用していた短いポーリングの代わりにWebsocketについて言及しています。ほとんどのリアルタイムメッセージングサービスがクライアントとサーバーの通信を処理する方法は、Webソケット、つまりサーバーとクライアント間のある種のトンネルを開いて維持することです。多分あなたはそれをすでに知っていたかもしれませんし、多分知らなかったかもしれません。しかし、これはこれらの質問で対処されており、まだの場合はそこから始めることをお勧めします。

従来のポーリング方法よりも優れた方法

ウェブサイトのポーリングのためのスケーラブルなソリューション

1
Richard

RabbitMq または Azure Service Bus のような実際のメッセージングサービスを使用します。サーバーAPIアプリケーションがトピックへの更新を送信すると、クライアント(デスクトップアプリケーション)がサブスクライバーになることができます。サブスクリプションクライアントは開いた接続を維持し、メッセージが到着すると受信します。

0
Kyle J V

バックエンドの記述方法を指定しなかったため、これが役立つかどうかはわかりません。

「WebSocketに基づいて構築された」「高レベル」プロトコルを探している場合は、 SignalR を検討できます。最新バージョンを使用する場合、それはクロスプラットフォーム(問題がある場合)であり、C# available のクライアント側API実装があり、WebFormアプリケーションに直接ドロップされます。

これを使用する利点は、「複数のサーバーを処理する方法」や「WebSocketコードを作成する方法」などの問題に対処し、代わりにビジネス上の問題の解決に集中できることです。

欠点は、それがどのように機能するかについて(非常に)意見が分かれており、バックエンドが.NETのみであることです。 Javaクライアント が利用可能ですが、サポートされているのは、最新の.Netコアバージョンを使用している場合のみです。

0
Reginald Blue