Comments (20)
- 换成mc或者redis,要做自己控制逻辑比较困难,router内部 不仅仅是 userid->serverid 的隐射,还包含了同一个userid 多次连接,分配序号区分等问题,而且还能处理 userid->room 房间的隐射,且需要原子操作,mc和redis都不是非常方便处理
- comet -> logic -> router 的目的是为了一致性hash 拆分router的压力问题。而不想把逻辑写到comet里,而且直接连接router 也不太合适,因为有可能需要做一些逻辑处理,比如connect 时候返回一些其他房间在线数据,这个都可以通过logic修改来实现
from goim.
还有一个好处就是因为logic 无状态,进行 router 扩容或者其他逻辑处理相对简单,comet职责只有一个就是 路由消息和连接,这样架构看起来简单点
from goim.
如果logic添加机器,comet的配置文件就需要修改,那么comet就需要重启服务,造成断线问题;如果comet不重启,随着comet压力的增加,所有的连接都会指向以前的配置机器,新增加logic机器压力上不去
from goim.
logic 可以 用lvs
from goim.
comet 不用重启的。 长连接到lvs VIP,加real server 就可以了,使用LC负载算法,最多在comet 加一个redial 原子替换 rpc client变量,在加入real server 以后重新均衡
from goim.
comet可以加个信号处理即可。
from goim.
哦,对的,虚ip可以解决这个问题,信号处理用zk?
from goim.
我说的信号处理是 linux signal,因为长连接的rpc,lvs加了real server以后,不会断开,要重新负载需要重新拨,另外目前rpc 是单连接的,所以负载还有一些问题,之后考虑rpc 单连接长连接+定长连接池来做就能解决这个问题了。
from goim.
通过信号处理,那为什么不彻底一点把comet和router都做成无状态服务
from goim.
comet 长连接,很难无状态。。router 最终状态保存地方,也很难,有更好的办法?
from goim.
我的意思是增删机器,其他都服务不用重启,添加一个comet,在job配置好文件后,通过信号量load配置文件,重新去连接comet服务器。最后再修改comet服务器对于都lvs或netscaler,这样当流量进来后,router就可以有新的地址,job转发的时候也可以指向新的comet
from goim.
新增comet来说,目前只需要重启job,job的热更新,我尽快搞下
comet的rpc reLoad也是一点
另外router 相对麻烦一些。
目前有几个问题还在考虑怎么解决
- comet如果挂了,需要通知所有router清理 这个comet的所有 路由信息
(这个目前打算在comet启动以后,调用一次kick操作,把router清理了,或者comet挂以后,人工清理,需要修改router多加一层 serverid -> sessions) - router 挂了从当前comet 汇聚数据比较麻烦
from goim.
第一条我觉得可以,
第二条如果router挂了
1.按照目前都逻辑,在启动时调用rpc到logic,通过被挂服务器的ip找到对应都serverId,router->logic->job->comet,需要在comet中保存serverId和userId的关系,然后再rpc到logic,再router
2.将comet和router配置文件存到远端,job和router都去远端读取。通过router的ip去logic找对应的serverId,如果不存在,那么这个就是新增机器,不用去同步数据,否则同步数据。在comet连接logic的时候需要返回serverId,保存serverId和userId的关系,再通过serverId去comet中查找。相当于是router->comet,比上一种会好很多。
from goim.
第一条已经搞定了,logic 提供了一个清理接口
第二条,还需要考虑下,如果按照comet 保存router serverid的思路,代码改动不少,而且相互依赖比较多一点。
目前可能先考虑下 router 双写或者主从或者是分布式强一致性,做一个容灾,比如可以在logic层操作router的时候,把路由信息发给kafka提供一个主从复制,或者是直接数据双写。
from goim.
router双写估计会比较麻烦,还要做同步,不如写到redis,key=serverId_userId,value=sId,seqId,roomId每个服务器的前缀不一样,获取keys*的估计有点慢,设置个过期时间。kafka是队列上线下线就没有办法删除。
from goim.
就是不想依赖redis 才开发router模块的,router性能比redis高很多,尤其是吞吐。。
from goim.
这个后续改成强一致性,双节点,不难的,微信也是用的quoram机制做的强一致性。
from goim.
何不考虑引入zk这样的机制来做这些服务的上下线的自动发现、感知,能给router省很多事儿。连kafka都引入了,kafka集群一般要引入zk,那还差一个zk吗?
from goim.
也需要同步,挂掉的机器,重启后怎么办呢
from goim.
@sumory 目前zk 用于comet 上线,注册serverid -> ip ,然后job 可以热更新
router 有点不太一样,router 主要是双写需要考虑,至于切的话,可能会用keepalived。
zk还是太麻烦了。
from goim.
Related Issues (20)
- 部署有问题,这样正常吗? HOT 2
- goim如何使用etcd?
- 怎么用啊 HOT 1
- 跑步起来,代码和说明文档不一致
- 任意room的一个消息是不是要被广播到所有的comet? HOT 3
- 项目不错,不过还是用自己的算了,目测go版本过于老旧,你应该及时更新go版本才对
- 如果goim里再加上微服务写在哪个模块比较好呢
- 多个线程处理同一个连接的目的 HOT 1
- comet 向客户端连接写入消息, protocol.go 文件中 WriteTCP方法,需要判断op == OpRaw, websocket缺不需要 HOT 1
- 消息堆积疑惑 HOT 1
- job是如何将消息推送到指定comnet? HOT 1
- step: 5 ws handshake timeout HOT 1
- job 消息丢失
- pkg/buffer可以直接用sync.Pool吧,为啥要自己实现一遍呢?
- 很多长连接(2w),仅连接保活,无业务情况,cpu忽然间隔很高:40%+
- 大量的房间或用户的情况下,无任何业务情况下,cpu间隔飙高30%
- 这么好的项目,感觉好久没更新了。有点可惜啊!! HOT 2
- 明显的逻辑问题,难道没人发现吗? HOT 6
- mac环境m1芯片不兼容discovery, 搞了docker容器把所有环境都装在里面了 一系列问题 老哥们来看看 HOT 5
- discovery 能把这个服务发现注册换成其他的吗。这个discovery好像早就没维护了。而且除了2.*版本其他也不兼容 HOT 1
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from goim.