最近在做一个即时通讯的服务,求大神讨论下netty的一个问题
最近在做一个即时通讯的服务,使用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)。。。
不太明白这是为什么,两个方案的性能差异肯定要自己手动测试一下,但是很多情况下测试会因环境原因受到影响
所以想拿出来探讨下目前方案的优劣