cim icon indicating copy to clipboard operation
cim copied to clipboard

单点或群聊发送消息不走Socket,看了再关

Open s949492225 opened this issue 4 years ago • 3 comments

Bug 描述 对于客户端来说,相互间的通信都是基于socket的,它不应该关注消息转发的逻辑.

1.在这点上消息发送上不统一,职责也不太清晰. 2.如果将来改成真正的点对点通信,类似于局域网内部传输,这种转发模式很致命 3.客户端模块应该是独立的,毕竟应该是两个人之间通信(转发是内部逻辑,不应该暴露给客户端).

可以考虑客户端发送给socket服务器,收到后socket返回ack,由socket服务器向中控服务器发送转发请求,中控服务器收到后,发到处理队列,并发轮训处理队列,存储消息,查询转发服务器转发,或存入离线服务中.

s949492225 avatar Apr 02 '20 10:04 s949492225

对于客户端来说,相互间的通信都是基于socket的,它不应该关注消息转发的逻辑.

这个我不太同意;客户端之间如果互相单独通信,那平台就没有意义了;比如微信不可能让你我单独私聊吧,所有消息都得经过平台,不然从业务上讲就没啥意义。

再从技术上讲,我们两个私聊的外网 IP 谁出?带宽之类的服务也是要钱的,必然得需要一个统一的服务器。

1.在这点上消息发送上不统一,职责也不太清晰.

客户端的职责仅只有发消息和收消息,不太清楚你说的职责不清晰是指他有了什么额外的职责。

2.如果将来改成真正的点对点通信,类似于局域网内部传输,这种转发模式很致命

真正的局域网点对点通信一般都是老师课堂教的 demo,没什么太大参考性。

3.客户端模块应该是独立的,毕竟应该是两个人之间通信(转发是内部逻辑,不应该暴露给客户端).

对于客户端来说只是一个消息发送的 http 接口而已,它并不清楚什么路由层是怎么处理的。

可以考虑客户端发送给socket服务器,收到后socket返回ack,由socket服务器向中控服务器发送转发请求,中控服务器收到后,发到处理队列,并发轮训处理队列,存储消息,查询转发服务器转发,或存入离线服务中.

这条不就和你说的点对点通信冲突了嘛,自然是需要一个服务器的;不过你说的由服务端转发我觉得才是职责不单一了,服务端应该只管接收消息然后推送消息,至于转发的事情交给 route 来做,这样一个是 route 可以水平扩展,服务端的职责也很单一。

任何架构都可以新增一层来解决问题我觉得非常有道理。

crossoverJie avatar Apr 02 '20 15:04 crossoverJie

确实通过http转发消失是最容易实现的,A<->B之间通信是不可能的,加一层c的话就是A<->C<->B,c作为一个转接层而已.

如果把C模糊化,那么就是A<->B之间的相互通信,虽然实际上AB没有直接的通信,,但是以面向对象的思维来考虑话,两个人应该是互相交流的,加个传话的,那么三个人之间也两两也是双向通信的.

你的架构是A->C->B,并不是直接双向通信的过程.其实这个是就是我所在意的点,虽然步骤复杂了,效率低了,却是通信的理解和对现实模拟的思考上的一个考虑

下面附上一个现代主流im的架构或者逻辑图(陌陌,weichat),他们之间都是相互通信的,希望可以说服你

20140908155552392 20140908155644246

s949492225 avatar Apr 03 '20 02:04 s949492225

是的,但就http考量,消息丢失等问题。也很难处理

q757571446 avatar Apr 28 '20 03:04 q757571446