使用netty设计服务器推送

时间:2012-05-03 20:04:29

标签: netty

在关于netty的第二个问题中。我们刚刚开始。我们有一个设计,我们需要使用 HTTP和长轮询 HTTP Streaming。我们估计5k到50k的连接用户已打开连接。我们知道tomcat无法处理,所以我们查看netty来完成任务。

设计应该足够简单,但我们不能使用websockets(我们很乐意在netty上使用hornetQ和websocket / stomp支持),但我们不能。

基本上我们将在连接的客户端中推送服务器(我们甚至可以使用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);
}

此致

1 个答案:

答案 0 :(得分:4)

看起来不错,但那里并不多。您如何处理长轮询启动和可能的后续超时? (或者也许你对这完全不错......这不是西班牙宗教裁判所)

您可以考虑的一件事,取决于您的" 网址队列的数量和受欢迎程度"是使用ChannelGroup作为订阅该URL队列的所有通道的容器。这样,您就可以将消息写入组中。此外,当频道关闭时,它们将从组中弹出,因此在那里有一些代码简化。

另外,您考虑过HTTP Streaming吗?在我看来,它不如websockets好,但比长轮询更好。

我并非110%确信所有实现都是完美的,但我已经整理了一个test project,演示了使用netty进行长轮询,websockets和http流的JSON推送。还有一个javascript客户端适应您选择的推送类型。您可能会发现它很有用(我很高兴得到任何反馈....)