golang 推送系统怎么做消息合并优化?

2020-04-08 21:15:55 +08:00
 laravel

比如服务端有 5000 人在线,每秒消息数 100 条,如果不优化,每秒的广播将是 50 万, 现在我想把 1s 之内的消息合并成 1 条,这样就只有 5000 次广播了,聊天这种 1s 延迟可以忍受。

现在的问题是 这种消息怎么保存?方便消费

语言 golang

3729 次点击
所在节点    程序员
25 条回复
lewinlan
2020-04-10 09:44:04 +08:00
在发送出口做个限流器呗。1 秒内的消息都 append 进一个 slice 里,用一个 Ticker 计时发送并清空 slice,很简单吧
vvmint233
2020-04-10 10:24:20 +08:00
或许在广播的前面加上一层缓冲区, 达到一定大小就清空缓冲区然后分发出去
zz554952942
2020-04-10 10:39:17 +08:00
聊天数据发送到 kafka,或者 RabbitMQ(确保数据不丢失)
然后启一个携程, time.tick 定时 1s 从消息队列取即可
zz554952942
2020-04-10 10:43:44 +08:00
亦或者可以用 Redis, 以用户 ID 做哈希键 然后当接收到消息的时候则把需要推送的用户 ID 的信息写到 Redis 上(这样子就把当个用户所需要的消息进行了合并)
然后携程定时从 Redis 里取所有数据 然后发送(取到的是一个哈希数组就是每个用户应该接收到的消息)
laravel
2020-04-22 18:43:49 +08:00
我已经打算 redis 或者用 go 实现 redis 的 list 也行,一次取 100-1000 条合并之后再广播

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/660593

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX