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

jkluooop 发布于 2015/04/14 17:19
阅读 1K+
收藏 1
最近在学习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应该是不能序列化跟反序列化的。
加载中
0
jobell
jobell

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

xmpp采用的模式。

0
hibegin
hibegin
先处理session的集中控制的机制,要找B聊天的话。A的服务器主动像B服务器申请一个 key给A用然后A 每次发消息携带这个 key 往B在的服务器发消息。 B会A的消息也走这样的流程。 服务器间转发也不是个事呀。文件,视频。估计
HikoQiu
HikoQiu
回复 @jkluooop : 请问你是怎么"把用户ID跟用户的IOSession一一对应"?
hibegin
hibegin
回复 @jkluooop : 用MINA 是可以的额 在Session 被关闭后会进入 sessinoClosed 后然后通知主服务器就行了。 移除这个回话。创建这些都类似吧。自己实现对NIOSession 了。 这样就可以监听到回话的一些信息了。
jkluooop
jkluooop
2. 文件,图片等二进制流,一般不会直接在消息里发送,可以先上传到文件服务器,返回url,然后把url放入消息里发送给用户B,用户B收到信息解析的时候再下载看。 实时视频没有想过。
jkluooop
jkluooop
'1. socket的session是没办法集中控制的,只能是集中在redis这类的nosql里维护一个用户连接列表. 所有的信息都是有from->to的,所以消息里都会有用户ID,只要把用户ID跟用户的IOSession一一对应就行,ServerB接收到信息会根据to的userid取to的IOSession. 再发送信息。
返回顶部
顶部