Golang无限缓存channel

手机软件开发 2024-9-19 17:35:29 118 0 来自 中国
需求

近来在弄一个游戏的gate网关转发服务器,服务器之间使用的是nats通讯,gate的作用是接收客户端发来的消息转发到对应的服务器上,并从nats上获取游戏服务器发送给客户端的消息并转发给客户端。前面接收还利益理,由于都是发布订阅模式的消息,收到消息直接向nats上扔就行了。但转发服务器来的消息就不一样了,从nats上取的速率弘大于gate转发给客户端的速率,会有数据囤积在nats中。为相识决这个标题,可以一个协和去nats中取数据,用多个协程并行转发给客户端,由于现在cpu都是n核的,多协程转发肯定会快的不止一点点,这里要注意一点的是,同个玩家的消息转发的次序不能变,就是按肯定的规则把同一个玩家的全部消息在同一个协程上转发就可以了。
为了现实这个转发,须要一个无限缓存的channel,先装nats中的数据读出来分别放到各转发协程的channal中,转发协程只从自己的channel取数据一条一条渐渐转发给客户端就行了。
计划

先说一下计划无限缓存channel的大至思绪,然后直接上完备代码。
分析

要到达前面的需求,我们须要计划的无限缓存channel应该满足几个要求:

  • 缓存无限。由于不知道nats那里会接收到多少消息,而转发大概会因网络颠簸壅闭。
  • 不能壅闭写。要包管接收nats消息的协程能及时处理全部的消息,并写入转发协程的channel中。
  • 无数据时壅闭读,此特性保持平静凡channle一样。没数据时转发协程处理壅闭等候。
  • 读写都应通过channle利用,平静凡channel的利用一样。
  • channle被关闭后,未读取的数据应该仍旧可读,此特性平静凡channle保持划一。
针对上面的要求,计划如下:

  • 由于go暂不支持利用符重载,所以封装一个布局体,包罗二个channel来分离读(Out Channel)和写(In Channel)。
  • 由于channel的缓存大小是有限的,须要一个可无限扩容缓存多于的数据,这里可以使用ringbuffer来实现。
  • 无限缓存内部数据FIFO实现
当Out Channel还没有满时,并且buf中没有数据,读取In中数据,将其放入Out,直到Out满
当Buf中有数据时,无论Out是否满,都将将In中读到的数据,直接写入到Buf中,目标就是为了包管数据的FIFO原则
实当代码

完备工程参见:https://github.com/zngw/zchan
1、双向环形链表
您需要登录后才可以回帖 登录 | 立即注册

Powered by CangBaoKu v1.0 小黑屋藏宝库It社区( 冀ICP备14008649号 )

GMT+8, 2024-11-22 10:19, Processed in 0.186768 second(s), 32 queries.© 2003-2025 cbk Team.

快速回复 返回顶部 返回列表