mina做的聊天服务端怎么做集群

发布于 2021-11-26 03:52:52 字数 553 浏览 945 评论 5

最近在学习mina,使用mina 写了个简单的聊天程序,私聊或者群聊。

遇到一个难点,单台的mina,所有的IOSession都在内存中,session之间通讯完全没问题。

但是如果有2台mina服务器,如果在serverA上的clientA要往在ServerB上的clientB发一条消息,怎么实现?

查看资料,有2个思路:

 1. 2个服务器之间开一个通讯服务,serverA将信息转发给serverB,serverB再发给clientB.

 2. 同1,使用activeMQ之类的消息服务器来做中转。如果是跨服务器通信,就把消息发到activeMQ, 广播给其他服务器处理

 3. 有人说罢IOSession放到一台memcache里,然后发消息的时候从memcache里按目标客户ID生成IoSesion,再发送。

    我觉得有问题吧,不管怎么说,IoSession应该是跟机器硬件有关,比如tcp/ip建立的底层socket.怎么可以通过

    对象去屏蔽不同服务器上的socket差异? IOSession应该是不能序列化跟反序列化的。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(5

挽清梦 2021-11-29 18:09:43

'1. socket的session是没办法集中控制的,只能是集中在redis这类的nosql里维护一个用户连接列表. 所有的信息都是有from->to的,所以消息里都会有用户ID,只要把用户ID跟用户的IOSession一一对应就行,ServerB接收到信息会根据to的userid取to的IOSession. 再发送信息。

奢望 2021-11-29 18:06:38

2. 文件,图片等二进制流,一般不会直接在消息里发送,可以先上传到文件服务器,返回url,然后把url放入消息里发送给用户B,用户B收到信息解析的时候再下载看。 实时视频没有想过。

猫九 2021-11-29 12:49:45

回复
用MINA 是可以的额 在Session 被关闭后会进入 sessinoClosed 后然后通知主服务器就行了。 移除这个回话。创建这些都类似吧。自己实现对NIOSession 了。 这样就可以监听到回话的一些信息了。

卸妝后依然美 2021-11-28 23:54:04

回复
请问你是怎么"把用户ID跟用户的IOSession一一对应"?

2021-11-28 11:52:17

先处理session的集中控制的机制,要找B聊天的话。A的服务器主动像B服务器申请一个 key给A用然后A 每次发消息携带这个 key 往B在的服务器发消息。 B会A的消息也走这样的流程。 服务器间转发也不是个事呀。文件,视频。估计

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文