当前位置: 首页 > 知识库问答 >
问题:

基于netty的服务器推送设计

吴鸿彩
2023-03-14

关于netty的第二个问题。我们只是从它开始。我们有一个设计,我们需要使用 <罢工> 具有长轮询的HTTP HTTP流。我们估计5k-50k连接的用户打开连接。我们知道tomcat不会处理,所以我们看着netty完成任务。

设计应该足够简单,但我们不能使用websocket(我们希望在netty上使用hornetQ,并提供websocket/stomp支持),但我们不能。

因此,基本上,我们将在连接的客户机中设置服务器推送事件(我们甚至可以使用JS SSE来实现)。

客户机将基于url订阅endpoint(就像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个答案

戚阳曜
2023-03-14

看起来不错,但是没有太多。您如何处理长轮询启动和可能的后续超时?(或者你完全擅长于此……这不是西班牙宗教法庭)

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

另外,您考虑过HTTP Streaming吗?在我看来,不如网络套接字好,但比长轮询好。

我不是110%有信心所有的实现都是完美的,但是我已经整理了一个测试项目,演示了使用netty进行长轮询、网络套接字和超文本传输协议的JSON推送。还有一个javascript客户端,它适应您选择的推送类型。你可能会发现它很有用(我很高兴得到任何反馈......)

 类似资料:
  • 问题内容: 在此处阅读有关服务器推送的信息。 我想将数据从Web应用程序实时推送到客户端。 我一直在将TCP套接字作为选项之一。 对于HTTP,我在这里找到了各种Java,PHP,Python和其他框架。但是我不知道这些工具是否支持Push。 您对实施服务器推送有什么建议和框架? 您会倡导使用哪种语言,为什么? 问题答案: 我现在正在使用Orbited,太好了! 如果您正在聊天或订阅类型的东西,请

  • Hprose 2.0 最大的亮点就是增加了推送功能的支持,而且这个功能的增加是在不修改现有通讯协议的方式下实现的,因此,这里的推送服务,即使不是 Hprose 2.0 的客户端或者服务器也可以使用。 当然,在旧版本的客户端调用推送服务,或者在旧版本的服务器上自己实现推送,需要多写一些代码。所以,如果你所使用的语言支持 Hprose 2.0,那幺推荐直接使用 Hprose 2.0 的推送 API 来

  • 服务器端提供了比较多的关于推送的 API,包括广播,多播和单播方式的推送,还有超时,心跳,推送事件等设置。 Timeout 字段 该字段用于设置推送空闲超时。默认值为 120 秒,即 2 分钟。 当服务器发布了推送主题后(后面会专门介绍推送),客户端会跟服务器端保持一个长连接,如果达到超时时间,仍然没有任何消息推送给客户端,则返回 nil,此时,如果客户端仍然在线的话,则会立即再次发送获取推送主题

  • 我有一个基于UDP网络的服务器。它有一个流水线,我在其中重写方法。 我需要时不时地写些信息。我只能通过使用中的套接字信息和中的通道来实现。为了能够重用这些信息,我保留在一个静态映射中。 我做错什么了吗? 有没有比将通道和远程地址保留在某个成员中更好的回写方法?

  • 我正在开发一个基于云的后端HTTP服务,该服务将公开用于与一些on-prem系统的集成。客户机系统是由外部供应商定制的,它们是带有自己数据库的后端系统。这些系统部署在我们客户的公司中,我们无法访问它们,也无法控制它们。我们向供应商提供我们的API规范,他们实现客户机代码。 我的服务与客户交换的数据格式基于XML,并遵循一定的标准。供应商用不同的编程语言实现他们的客户机系统,随着时间的推移,新的供应

  • subscribe 方法 client.subscribe(topic, callback[, timeout[, failswitch]]); client.subscribe(topic, id, callback[, timeout[, failswitch]]); subscribe 方法的用处是订阅服务器端的推送服务。该方法有两种方式,一种是自动获取设置客户端 id,另一种是手动设置客