この文は、問題と解決策をほぼ明らかにしています。
TCP を使用してメモリ効率を改善しましたが、get 操作を UDP に移行して、ネットワーク トラフィックを削減し、マルチ get (数百のキーを並行して取得) 用のアプリケーション レベルのフロー制御を実装しました。
TCP もフロー制御であり、Memcacheマルチ取得の場合はかなりシリアルです。接続を開き(またはプールし)、キーのリストをクエリし、待機してから、すべての値のリストで結果を取得します。代わりに、コネクションレスの並列 UDP getsの上に、アプリケーション レベルのフロー制御自体を実装しました。FBサイズのソフトウェアで見られるUDPの利点は次のとおりです。
- 接続を開いたり、プールしたり、追加のラウンドトリップ、セッション、ハンドシェイク、キープアライブなどを行う必要はありません。
- 複数の分散型 Memcache サーバーとインデックスを並行してクエリできます。これは、マイクロサービスの精神とサービスとしての「マイクロキャッシュ」に適しています。
- UDP パケットをマルチキャストして、冗長性、負荷分散、動的ルーティング、さらにはシャーディングを備えた高可用性を提供できます - 最初の応答が勝ちます!
- 個々の取得タイムアウトおよび再試行ポリシーは、アプリケーション レベルで実装できます。
- ロジックは、部分的に完全なデータが利用可能になるとすぐに実行できます。完全なマルチ取得結果を待つ必要はありません。
一方、一貫性のためにTCP経由で書き込みを行うと思います。TCP と memcached は、リクエストが送信され、レスポンスがキャッシュの更新を確認するトランザクションを提供します。UDPでそれを再実装しても、あまりメリットはないと思います。