最近在做一个即时通讯的服务,求大神讨论下netty的一个问题

a540057001 2016-09-22 02:23:26
最近在做一个即时通讯的服务,使用netty来进行通信,整个系统大概划分为:Gateway、Auth、Manager三个服务
Gateway用来维护服务器与用户的长连接(也是netty所在的模块)
Auth用于注册、登陆
manager是业务模块
三个服务间使用dubbo进行异步通讯

正常的情况应该是:netty将数据解码转换为POJO,再将POJO发送到具体服务处理业务
但是因为感觉将POJO发送到具体服务又要2次编码、解码

与是将用户与服务器间的通讯格式定义为:
|---------------|------------|---------|
|消息体长度|动作编号|消息体|
|---------------|------------|---------|

消息体长度用于处理tcp粘包/拆包
动作编号用来标明什么业务操作
消息体是具体的数据

设想为:Gateway接收信息,根据动作编号,将未解码的二进制数据发送到Auth服务或Manager服务,由具体服务进行解码
这样避免了Gateway与其它服务的二次解码编码


但是,在《netty权威指南》的18.1.5章节,有如下一句话:
netty的多线程编程最佳实践如下:
(1)。。。
(2)。。。
(3)解码要放在NIO线程调用的解码Handler中进行,不要切换到用户线程中完成消息的解码。
(4)。。。
(5)。。。

不太明白这是为什么,两个方案的性能差异肯定要自己手动测试一下,但是很多情况下测试会因环境原因受到影响
所以想拿出来探讨下目前方案的优劣
...全文
537 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
a540057001 2016-10-17
  • 打赏
  • 举报
回复
引用 2 楼 sungangaa 的回复:
“解码要放在NIO线程调用的解码Handler中进行,不要切换到用户线程中完成消息的解码” 我感觉这个意思是说,在NIO event loop里解码之后,可以直接将POJO扔到业务线程池里去,业务线程池处理之后通过future回调等待event loop异步处理。 你说得情况感觉跟这个不一样。
直接将二进制数据扔到业务线程池去解码,这样应该更能提高netty的效率吧?
sungangaa 2016-10-07
  • 打赏
  • 举报
回复
“解码要放在NIO线程调用的解码Handler中进行,不要切换到用户线程中完成消息的解码” 我感觉这个意思是说,在NIO event loop里解码之后,可以直接将POJO扔到业务线程池里去,业务线程池处理之后通过future回调等待event loop异步处理。 你说得情况感觉跟这个不一样。
a540057001 2016-09-23
  • 打赏
  • 举报
回复
没人么????

67,513

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧