1

nettyに関する2番目の質問で。私たちはそれを始めたばかりです。そして、ロング ポーリングHTTP ストリーミングで HTTPを使用する必要がある設計があります。接続が開かれている 5,000 ~ 50,000 人の接続ユーザーから推定しています。tomcat では処理できないことがわかっているので、タスクを実行するために netty を調べます。

設計は十分に単純である必要がありますが、websocket を使用することはできません (websocket/stomp をサポートする netty の上で hornetQ を使用したいと考えています) が、使用できません。

したがって、基本的には、接続されたクライアントでサーバー プッシュ イベント (JS SSE を使用して実行することもできます) を行います。

クライアントは、URL に基づいてエンドポイントにサブスクライブします (JMS のキューのように、はるかに単純ですが)

そのため、イベントを生成し、関心のあるチャネルに通知するプロセスをサーバー側に用意します (これには単純なオブザーバー パターンを使用しています)。

したがって、チャネルはそれらのプロセスをサブスクライブし、それらからイベントを受け取ります。

今日の私の質問は、私たちが使用した設計アプローチが netty のアーキテクチャを考慮して正しいものであるかどうかを確認することです。

public void channelConnected(ChannelHandlerContext ctx, ChannelStateEvent e) throws Exception {
    service.subscribe(this);
    this.context = ctx;
    ctx.sendUpstream(e);
}

//this method gets called by the service when a server event happens
public void onUpdate(String message) {
  ChannelBuffer buffer = Channels.buffer(message.getBytes().length());
  buffer.writeBytes(message.getBytes());
  ChannelFuture future = Channels.future(this.context.getChannel());
  future.addListener(ChannelFutureListener.CLOSE);
  Channels.write(this.context,future,buffer);
}

よろしく

4

1 に答える 1

4

大丈夫そうに見えますが、そこにはあまりありません。長いポーリング開始とその後のタイムアウトの可能性をどのように処理していますか? (あるいは、あなたはそれが得意なのかもしれません..... これはスペインの異端審問ではありません)

「 URL キュー」の数と人気に応じて、その URL キューにサブスクライブするすべてのチャネルのコンテナーとしてChannelGroupを使用することを検討してください。そうすれば、グループにメッセージを書き込むことができます。さらに、チャネルが閉じられると、それらはグループから排出されるため、コードが単純化されています。

また、HTTP ストリーミングを検討しましたか? 私の見解では、WebSocket ほどではありませんが、長いポーリングよりは優れています。

すべての実装が完璧であると 110% 確信しているわけではありませんが、netty を使用してロング ポーリング、Websocket、および HTTP ストリーミングを行う JSON プッシュを示すテスト プロジェクトをまとめました。また、選択したプッシュ タイプに適応する JavaScript クライアントもあります。役に立つかもしれません (それに関するフィードバックをいただければ幸いです....)。

于 2012-05-03T20:59:37.453 に答える