异步通知的实现
异步通知的实现
前言
有这样一个需求,需要对用户进行消息通知,如果用户在线就立即通知,如果用户不在线需要把通知缓存起来等待用户上线后异步通知。这样的异步通知在游戏,通讯中是非常常见的需求。
这里介绍几个常见的解决方案。
消息持久化方案
在检测到用户并未在线时,将消息和消息内容持久化到数据库中,等待用户上线时,查表建立通知操作,通知用户消息。通知完删除记录。
1
2
3
4
5
6
type Notify struct {
NotifyId string
UserId string
Content string
Timestamp int64
}
如果消息是非常频繁的,那么这样的方案的压力会集中在数据库上,这是非常危险的。比如消息是聊天记录,那么一个用户可能会用几十几百条消息等待异步通知,在用户量非常大的情况下,可能会带来数据库的崩溃。
消息缓存方案
消息持久化的地方如果位于redis缓存中,可以承受的压力就会大很多。
1
2
key := "notify:" + userId
value := content
但是KV型缓存无法储存复杂的消息内容,可能需要对消息结构进行序列化。频繁的序列化和反序列化会带来计算压力的增大。
重复消息的处理
在消息处理中,通常会出现多条消息可以被合并为一条消息的情况。在这种情况下,需要对消息表结构进行唯一性约束设计,
This post is licensed under CC BY 4.0 by the author.