【问题标题】:Design of a server push using netty使用netty设计一个服务器推送
【发布时间】:2016-11-27 06:30:35
【问题描述】:

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

设计应该足够简单,但我们不能使用 websockets(我们希望在支持 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);
}

问候

【问题讨论】:

    标签: netty


    【解决方案1】:

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

    根据“URL 队列”的数量和受欢迎程度,您可能会考虑的一件事是使用 ChannelGroup 作为订阅该 url 队列的所有频道的容器。这样,您就可以将消息写入组。另外,当通道关闭时,它们会从组中弹出,所以这里有一些代码简化。

    另外,您是否考虑过 HTTP 流式传输?在我看来,不如 websockets,但比长轮询好。

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

    【讨论】:

    • 非常感谢您的见解。代码非常简化。我需要添加更多清洁:)。对不起,我的错误,我实际上是在考虑 http 流而不是长轮询,在客户端我们将打开连接并继续读取它。我会检查项目,我可能会从中获得一些好的见解。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-10
    • 2015-06-22
    • 1970-01-01
    • 1970-01-01
    • 2012-11-16
    相关资源
    最近更新 更多