Post

异步通知的实现

异步通知的实现

前言

有这样一个需求,需要对用户进行消息通知,如果用户在线就立即通知,如果用户不在线需要把通知缓存起来等待用户上线后异步通知。这样的异步通知在游戏,通讯中是非常常见的需求。

这里介绍几个常见的解决方案。

消息持久化方案

在检测到用户并未在线时,将消息和消息内容持久化到数据库中,等待用户上线时,查表建立通知操作,通知用户消息。通知完删除记录。

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.