CNode

如何用nodejs构建分布式聊天系统

Hhaofanlu发布于13 年前最后回复13 年前16 回复15198 浏览0 收藏

不知道哪位兄弟做过,能否指点下

查看回复

回复 (15)

S
sumory#1·13 年前
  1. session外存储,比如使用redis,这样多节点间可以共享
  2. 负载均衡使用nginx,转发请求到各个node chat节点
  3. redis存储用户基本信息,如状态信息、好友关系
  4. node chat节点间通信使用redis的pub/sub
  5. 前端使用socket.io或者自己封装长连接
  6. 做好客户端断开重练和服务端node chat节点的动态增删
H
halfblood#3·13 年前

pomelo搞这种高实时,分布式的应用太完美了,亲身体验啊!

H
halfblood#4·13 年前
引用 sumory1. session外存储,比如使用redis,这样多节点间可以共享 2. 负载均衡使用nginx,转发请求到各个node chat节点 3. redis存储用户基本信息,如状态信息、好友关系...

NB,说的太全面了! 1.session用redis做外存,怎么保证session的同步啊?因为reids的读写都是异步的,而且要经过socket传输,所以不可避免的会出现session不同步的情况。 2.redis当做rpc通信使用,这个想法很有创意,不知道有没有测试过其性能啊?

这也是我之前考虑的问题,不过还没有很好的解决方式……

H
haofanlu#5·13 年前

pomelo有用过的吗,性能怎么样?

H
halfblood#7·13 年前
引用 sumory1. session外存储,比如使用redis,这样多节点间可以共享 2. 负载均衡使用nginx,转发请求到各个node chat节点 3. redis存储用户基本信息,如状态信息、好友关系...

@sumory 如果允许用户修改session,即使不是临界资源也会不同步的。比如一个用户连续两个有先后顺序请求,第一个请求对session做了修改,而第二次请求需要获取修改后的session信息。但是session的读写完全是异步的,不能保证第二次请求获取的session就是最新的。

S
sumory#9·13 年前
引用 sumory1. session外存储,比如使用redis,这样多节点间可以共享 2. 负载均衡使用nginx,转发请求到各个node chat节点 3. redis存储用户基本信息,如状态信息、好友关系...

@halfblood 是这样的,但也不可能给session存取加锁,那就没意义了,所以尽量不放临界,并且系统可容忍适当修改.

S
sumory#10·13 年前
引用 sumory1. session外存储,比如使用redis,这样多节点间可以共享 2. 负载均衡使用nginx,转发请求到各个node chat节点 3. redis存储用户基本信息,如状态信息、好友关系...

@halfblood session里尽量不要存经常变动的信息,而且只有一个节点负责session的话没有同步问题啊,所有客户端都是使用同一个redis节点里的session。redis的pub/sub性能可以啦。

H
halfblood#11·13 年前
引用 haofanlupomelo有用过的吗,性能怎么样?

性能挺好的,看你用什么协议了!如果服务器配置还行的话,一般可以撑到协议的上线……

H
halfblood#12·13 年前
引用 sumory1. session外存储,比如使用redis,这样多节点间可以共享 2. 负载均衡使用nginx,转发请求到各个node chat节点 3. redis存储用户基本信息,如状态信息、好友关系...

@sumory 一个节点的redis也有同步的问题啊。如果允许用户对session进行修改的话,必然面临着对全局session加锁的考虑啊,不然很容易出现不一致的情况的。

S
sumory#13·13 年前
引用 sumory1. session外存储,比如使用redis,这样多节点间可以共享 2. 负载均衡使用nginx,转发请求到各个node chat节点 3. redis存储用户基本信息,如状态信息、好友关系...

@halfblood 啊?这个不是问题吧。你非要把临界资源放到session里?比如放个count到session,session不用来也不应该用来做这种事情。

H
haofanlu#15·13 年前

多谢各位的分享,我们做的是手游项目,前台用的flash starling框架,后台用php,实时部分打算用nodejs,不知各位有什么好的建议?

参与回复
登录后即可参与回复。登录