Code Monkey home page Code Monkey logo

Comments (20)

Terry-Mao avatar Terry-Mao commented on June 7, 2024
  1. 换成mc或者redis,要做自己控制逻辑比较困难,router内部 不仅仅是 userid->serverid 的隐射,还包含了同一个userid 多次连接,分配序号区分等问题,而且还能处理 userid->room 房间的隐射,且需要原子操作,mc和redis都不是非常方便处理
  2. comet -> logic -> router 的目的是为了一致性hash 拆分router的压力问题。而不想把逻辑写到comet里,而且直接连接router 也不太合适,因为有可能需要做一些逻辑处理,比如connect 时候返回一些其他房间在线数据,这个都可以通过logic修改来实现

from goim.

Terry-Mao avatar Terry-Mao commented on June 7, 2024

还有一个好处就是因为logic 无状态,进行 router 扩容或者其他逻辑处理相对简单,comet职责只有一个就是 路由消息和连接,这样架构看起来简单点

from goim.

qinlodestar avatar qinlodestar commented on June 7, 2024

如果logic添加机器,comet的配置文件就需要修改,那么comet就需要重启服务,造成断线问题;如果comet不重启,随着comet压力的增加,所有的连接都会指向以前的配置机器,新增加logic机器压力上不去

from goim.

Terry-Mao avatar Terry-Mao commented on June 7, 2024

logic 可以 用lvs

from goim.

Terry-Mao avatar Terry-Mao commented on June 7, 2024

comet 不用重启的。 长连接到lvs VIP,加real server 就可以了,使用LC负载算法,最多在comet 加一个redial 原子替换 rpc client变量,在加入real server 以后重新均衡

from goim.

Terry-Mao avatar Terry-Mao commented on June 7, 2024

comet可以加个信号处理即可。

from goim.

qinlodestar avatar qinlodestar commented on June 7, 2024

哦,对的,虚ip可以解决这个问题,信号处理用zk?

from goim.

Terry-Mao avatar Terry-Mao commented on June 7, 2024

我说的信号处理是 linux signal,因为长连接的rpc,lvs加了real server以后,不会断开,要重新负载需要重新拨,另外目前rpc 是单连接的,所以负载还有一些问题,之后考虑rpc 单连接长连接+定长连接池来做就能解决这个问题了。

from goim.

qinlodestar avatar qinlodestar commented on June 7, 2024

通过信号处理,那为什么不彻底一点把comet和router都做成无状态服务

from goim.

Terry-Mao avatar Terry-Mao commented on June 7, 2024

comet 长连接,很难无状态。。router 最终状态保存地方,也很难,有更好的办法?

from goim.

qinlodestar avatar qinlodestar commented on June 7, 2024

我的意思是增删机器,其他都服务不用重启,添加一个comet,在job配置好文件后,通过信号量load配置文件,重新去连接comet服务器。最后再修改comet服务器对于都lvs或netscaler,这样当流量进来后,router就可以有新的地址,job转发的时候也可以指向新的comet

from goim.

Terry-Mao avatar Terry-Mao commented on June 7, 2024

新增comet来说,目前只需要重启job,job的热更新,我尽快搞下
comet的rpc reLoad也是一点
另外router 相对麻烦一些。

目前有几个问题还在考虑怎么解决

  1. comet如果挂了,需要通知所有router清理 这个comet的所有 路由信息
    (这个目前打算在comet启动以后,调用一次kick操作,把router清理了,或者comet挂以后,人工清理,需要修改router多加一层 serverid -> sessions)
  2. router 挂了从当前comet 汇聚数据比较麻烦

from goim.

qinlodestar avatar qinlodestar commented on June 7, 2024

第一条我觉得可以,
第二条如果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.

Terry-Mao avatar Terry-Mao commented on June 7, 2024

第一条已经搞定了,logic 提供了一个清理接口

第二条,还需要考虑下,如果按照comet 保存router serverid的思路,代码改动不少,而且相互依赖比较多一点。
目前可能先考虑下 router 双写或者主从或者是分布式强一致性,做一个容灾,比如可以在logic层操作router的时候,把路由信息发给kafka提供一个主从复制,或者是直接数据双写。

from goim.

qinlodestar avatar qinlodestar commented on June 7, 2024

router双写估计会比较麻烦,还要做同步,不如写到redis,key=serverId_userId,value=sId,seqId,roomId每个服务器的前缀不一样,获取keys*的估计有点慢,设置个过期时间。kafka是队列上线下线就没有办法删除。

from goim.

Terry-Mao avatar Terry-Mao commented on June 7, 2024

就是不想依赖redis 才开发router模块的,router性能比redis高很多,尤其是吞吐。。

from goim.

Terry-Mao avatar Terry-Mao commented on June 7, 2024

这个后续改成强一致性,双节点,不难的,微信也是用的quoram机制做的强一致性。

from goim.

sumory avatar sumory commented on June 7, 2024

何不考虑引入zk这样的机制来做这些服务的上下线的自动发现、感知,能给router省很多事儿。连kafka都引入了,kafka集群一般要引入zk,那还差一个zk吗?

from goim.

qinlodestar avatar qinlodestar commented on June 7, 2024

也需要同步,挂掉的机器,重启后怎么办呢

from goim.

Terry-Mao avatar Terry-Mao commented on June 7, 2024

@sumory 目前zk 用于comet 上线,注册serverid -> ip ,然后job 可以热更新

router 有点不太一样,router 主要是双写需要考虑,至于切的话,可能会用keepalived。

zk还是太麻烦了。

from goim.

Related Issues (20)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo 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.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.