每一个Node中,都有一个IsAlive来表示连接是否成功。如不雅连接断开,或者因为其他原因强迫停止办事的话,会修改此标记状况。然后由准时的处理机制将此连接封闭并大年夜内存中清除。 Rows的本质就是一组事先设定了长度的Node Slice。
二、消息治理
- var messageChannel map[string]chan nodeMessage
- func init() {
- messageChannel = make(map[string]chan nodeMessage)
- }
- func sendMessageToChannel(roomId string, nm nodeMessage) error {
- //如不雅房间不存在,创建一个房间
- if c, ok := messageChannel[roomId]; ok {
- c
- } else {
- //创建房间通道
- messageChannel[roomId] = make(chan nodeMessage, 1024)
- messageChannel[roomId]
- //创建房间实例
- roomObj := &RoomInfo{}
- roomObj.RoomID = roomId
- roomObj.Rows = make([]*RowList, 0, 4)
- roomObj.Lock = &sync.Mutex{}
- //创建新的协程来监控房间
- go daemonReciver(messageChannel[roomId], roomObj)
- go timerForClean(messageChannel[roomId])
- //如不雅是大年夜厅的话,启动大年夜厅清理协程
- if roomId == "" {
- go CleanHall(roomObj)
- }
- }
- return nil
- }
以上是关于弹幕信息传递的一部分代码。 起首,每一个房间,都有本身的消息通道,所有的┞封些通道根据RoomID为key,记录在一个叫做messageChannel的map琅绫擎。 每次收到消息的时刻,都直接把消息丢到channel琅绫擎,就可以了。(后面由守护协程来处理)如不雅没有房间通道的话,就建立房间的通道channel,并启动每个房间的一系列协程。
三、办事器治理
一、房间治理
这里的筹划比较简单,其实就是建立一个上一层的聊天室即一个房间,所有的办事器都邑主动连接到这里,每一个办事器收到的信息,就会在这个房间琅绫擎广播到其余机械去。
四、守护协程们治理
守护协程处理很多琐碎的工作,包管房间内信息的┞俘常分发以及房间连接的┞俘常治理。各个守护协程的功能如下:
- 消息发送协程:每个房间配备一个,大年夜channel琅绫擎获取到要发送到本房间的消息,然后在并发调用各个RowList的发送消息机制。
- 房寄┞符理协程 :因为会有连接断开、房间改换等修改Node状况的行动,所以按期会有房寄┞符理协程来进行节点整顿,删除当前房间无关的节点等以进步消息的发送效力。
因为须要解决的问题比较紧急,所以快速做了一些逻辑上的改变和营业层面的弃取:
- 对Redis的实例进行了拆分,应用了双机,单机4实例的方法,分散了Redis的压力
- 对消息处理worker过程的逻辑做了一些修改,限制了单位时光内进行广播的消息数量,多余的消息会被丢弃 。
推荐阅读
【限时免费】岁尾最强一次云计算大年夜会,看传统、社区、互联网企业若何碰撞? 在Spring框架中最常见的几个注>>>详细阅读
本文标题:弹幕系统更新的血与泪
地址:http://www.17bianji.com/lsqh/40081.html
1/2 1

网友点评
精彩导读
科技快报
品牌展示