goim 源码分析(一) comet
启动comet服务
今天就来看看comet怎么开启服务,然后怎么去控制buckt,room和在线人数的
new comet server
srv := comet.NewServer(conf.Conf)
func NewServer(c *conf.Config) *Server {
s := &Server{ //1
c: c,
round: NewRound(c),
rpcClient: newLogicClient(c.RPCClient),
}
// init bucket
s.buckets = make([]*Bucket, c.Bucket.Size)
s.bucketIdx = uint32(c.Bucket.Size)
for i := 0; i < c.Bucket.Size; i++ {
s.buckets[i] = NewBucket(c.Bucket)
}
s.serverID = c.Env.Host
go s.onlineproc() // 3
return s
}
- 创建了一个服务
- 初始化了bucket
func (s *Server) onlineproc() {
for {
var (
allRoomsCount map[string]int32
err error
)
roomCount := make(map[string]int32)
for _, bucket := range s.buckets {
for roomID, count := range bucket.RoomsCount() {
roomCount[roomID] += count
}
}
if allRoomsCount, err = s.RenewOnline(context.Background(), s.serverID, roomCount); err != nil {
time.Sleep(time.Second)
continue
}
for _, bucket := range s.buckets {
bucket.UpRoomsCount(allRoomsCount)
}
time.Sleep(time.Second * 10)
}
}
在这里开启了一个自询服务,
1)遍历buckets,再遍历rooms,获取所有在线人数。
2)通过RenewOnline rpc发送到logic
3)写回每一个rooms中
4)每隔10秒钟重复一次操作
我们再来看一下开启websocket服务
func InitWebsocket(server *Server, addrs [