-
Notifications
You must be signed in to change notification settings - Fork 2.9k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
为什么server转发消息给目的client的时候要走netty而不是直接http调用呢 #65
Comments
这也是我遇到的一个问题,因为cA和cB可能在不同的im服务器上面,如果直接走netty的话,那么消息发送到A服务器,这时候因为cB长连接是和B服务器,这时候还得做im服务器之间的通讯才能收发消息,所以作者才通过http这种方式发消息。但是如果一定要走netty有么有好的实现方式呢,就是路由要怎么设置 |
现实环境中,只有server端有公网环境能被访问到,client是没法被直接访问到的 |
我也是查阅了比较多开源im方案也是在考虑这个问题.如果一定要走netty的连接通讯是可以的也是我们下意识认为的im实现.netty默认有两个线程池为连接和io工作.业务确实不应该在这两个线程组执行.目前我考虑的方案是创建DefaultEventExecutor线程池跑业务(向队列发送消息,处理完毕接收回执再转发给目标.乍一看绕一圈好像netty并没有减轻压力.主要是离线消息处理).如果不在netty注册线程是没办法拿到channel对象的 |
我在想除了登录注册获取服务器,发送消息为什么不直接都走netty 的tcp反而client发送消息的时候走http?短连接感觉量大了性能会降低很多呀 |
我个人理解 这个不单单是为了实现im的功能吧。 |
对于一个c/s架构来说,已经有了socket连接。你还是让每个client再启一个web服务,用http通信,这么做的意义何在。 |
期待看到一个结论🥺 |
首先,S->C的消息走netty是没什么争议的.我想主要的问题是在C->S的消息为什么是http会让人疑惑,我觉得这点应该很好理解,如果C->S的消息也是socket那么在多im server的情况下client岂不是要保持两个长连接(route和im)?而如果是这样的话route服务器是未必可以支撑的,发送消息走http可以较好的解决route服务器的设计难度.不可否认的是http在多数情况下是比socket可靠的,那这也保证了消息的丢失率,至于作者一开始的设计思路是为何就不得而知了 |
因为每个client跟服务器是通过netty建立的长连接,用户之间发送消息用http也可,再用netty也行,用netty可能没有http简单,但是http频繁的连接断开,在并发量大的时候会耗费性能,所以我觉得server之间通过netty发送消息更好一些,可以充分的利用一个连接或多个长连接。 |
个人理解。 |
RT,以clientA发消息给clientB为例,我目前梳理流程是这样的:
clientA ->(http invoke) -> router ->(http invoke) -> server,
然后server转发消息到clientB的时候是查找SessionSocketHolder,找到对应的NioSocketChannel,然后把消息write进去。
所以我的疑问是,为什么客户端发给服务端的请求直接走http,由SpringBoot的Controller受理,而server转发的请求要走netty呢?
The text was updated successfully, but these errors were encountered: