2012-05-03 10 views
1

nettyに関する2番目の質問になります。私たちはそれから始まっています。そして我々は HTTPと長いポーリングのHTTPを使用する必要があるデザインを持っています HTTPストリーミング。私たちは5kから50kの接続ユーザをオープンな接続で見積もっています。私たちはtomcatが処理しないことを知っているので、私たちはその目的を達成するためにネットを見ます。nettyを使用したサーバープッシュの設計

デザインはシンプルでなければなりませんが、ウェブソケットを使用することはできません(websocket/stompサポートでnettyの上にhornetQを使用するのが大好きです)。

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

クライアントが

だから私たちはイベントを生成サーバ側のプロセスを持つことになります(ただし、JMSのキューのようなはるかに簡単)URLに基​​づいて、エンドポイントにサブスクライブし、(私たちが興味を持ってチャンネルを通知しますこれに対して単純なオブザーバーパターンを使用しています)。

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

今日の私の質問は、私たちが使用したデザインアプローチが、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

は大丈夫見えるが、あまりそこではありません。長いポーリング開始と後続のタイムアウトはどのように処理していますか? (または、おそらくあなたはそれとは全くいいです.....これは、スペインの異端審問ではありません)あなたの「URLキュー」の数と人気に応じて、あなたが考えるかもしれません

ことの一つは、使用することですChannelGroupは、そのURLキューに登録されているすべてのチャネルのコンテナとして使用されます。そうすれば、メッセージをグループに書き込むことができます。さらに、チャンネルが閉じるとグループから取り除かれるので、そこでコードを簡略化します。

また、HTTPストリーミングについて考えましたか?私の考えでは、WebSocketほど良くはないが、長いポーリングよりも優れている。

私はすべての実装が完璧であるとは確信していませんが、長いポーリング、Webソケット、httpストリーミングにNettyを使用したJSONプッシュを示すtest projectをまとめました。あなたが選択したプッシュタイプに適応するjavascriptクライアントもあります。役に立つと思うかもしれません(そして、私はそれに関するフィードバックをお寄せいただきありがとうございます....)

+0

洞察力に感謝します。コードは非常に単純化されています。私はより多くの掃除を追加する必要があります:)。私は申し訳ありませんが、私の間違いは、私は実際に長いポーリングではないHTTPストリーミングを検討している、クライアント上で私たちは接続を開き、それから読書を続けます。私はそれからいくつかの良い洞察を得るかもしれないプロジェクトをチェックします。 –

関連する問題