有这么一个企业应用的需求,底层数据的变动会触发一个事件,这个事件需要发送给订阅的用户。用户主要是在上线时(打开页面时)拉取属于自己的信息(严格按时序排列)。如果将所有这些事件利用系统会话发送给指定的用户(一个事件可能需要发送给10~100个用户),就会产生大量的系统会话记录(比如每秒上千个事件),一年有估计几十到几百个million。在这种场景下,每个用户上线时去拉取属于自己的信息,会不会遇到性能下降的情形?

我们在考虑是自己搭建一个基于kafka的消息系统,还是采用leanmessage,请不吝赐教。如果能够提供Leanmessage后台的机制更加感谢(比如系统会话的索引机制,或者是否考虑为每个用户作一个拉取信息用的队列,类似微信朋友圈)

你好,
从描述来看,LeanMessage 是完全能够实现上述任务的。不过由于消息量比较大,用户离线期间可能会积累大量消息,所以考虑可以使用未读消息的方式获取: https://leancloud.cn/docs/realtime_v2.html#离线消息6
即用户上线后,服务端不是将离线消息全部下发,而是只是下发一个离线计数,用户拿着计数自己从历史记录中拉取未读消息即可。
对于性能上的考虑,因为拉取消息的时候不是一口气将所有的历史记录都拉取一遍,而是分批的一批一批从新到旧的拉取消息,性能并不会因为数据量的增长而出现大幅变化的。

感谢回复!
其实我担心的正是“而是分批的一批一批从新到旧的拉取消息”时,leanmessage后面采用的索引机制是什么,这种索引机制是否能够从理论上保证“性能并不会因为数据量的增长而出现大幅变化的。” 如传统数据库,即使采用了索引,当数据量增大到一定程度上的时候,索引查询的性能也会逐渐下降(索引也会越来越大)。

你好,我们底层使用的是 HBase。有兴趣的话可以了解一下其实现机制。总之就是说我们在很大程度上能避免因为数据增长而导致查询变慢。

好的,多谢,我们先尝试下!
但是....系统会话消息的发送和下发...只能使用REST API...这是什么原因? 我们还是希望使用SDK,因为我们打算是在客户端和系统会话之间做一层缓存,比如用LeanCache,将用户最近100条消息缓存起来,所以用SDK做中间的处理会比较方便,用REST太别扭了。

另外系统会话还有to_peers不能够超过20个的限制,也是头痛

你好,

系统会话最初目的是实现类似微信公共号的功能,一个公共号背后可能并不是一个用户来管理,有多个人,所以以 API 的方式可能更好一些。并且 SDK 也是支持对 API 的调用的。

我在想你们的这个需求有没有可能使用普通会话实现呢?因为系统会话的话最初是想给一个会话内所有用户发消息的。

比如让这个发出消息的设备跟接收消息的用户分在同一个会话中。

多谢您的及时回复!

实际上我们也在想这个问题,是不是可以用普通会话。主要考虑的问题是,每一条消息(事件)要送达的用户对象都是动态的(用户可以随时订阅和退订事件,比如#1消息发送给用户A,B,C,#2消息发送给用户C, D, E),用普通会话就需要动态的管理会话成员,或者需要为每一个事件都建立一个普通会话。所以,感觉上如果都是发送10,000条消息的话, “在一个系统会话上发送10,000个消息”,似乎要比“建立10,000个普通会话但是每个会话只有一条消息”要合理的多。

或者建立一个普通会话把所有的用户都加为成员(每次新用户注册都要加入这个会话)?这样也不对啊,这样每条消息这个会话内的所有用户都可以收到阿

明白了,这么看使用系统会话是更有道理一些。

在您的帮助下,我们自己又重新梳理了一下思路,请您再帮忙review下是否可行:

1.服务端运行LeanEngine上,通过Hook函数,在AV.Object发生变化时产生消息。

2.产生的消息根据AV.User的follow关系和自定义的relation表决定发送给哪些用户(可能多于20个用户

  1. 服务端利用**“系统对话给用户发消息”**的REST API将消息发送给系统会话

问题:“系统对话给用户发消息”时,是from谁发的消息?

问题:“系统对话给用户发消息”时,to不能超过20个用户,如何处理?(考虑将超过20个接受者的消息拆分成多条不知是否可行)

4.客户端(网页)利用REST API直接获取属于自己的消息

问题:如果只想获得未读消息,如何调用REST API? 因为我们的客户必须使用网页,所以不太需要“推送”消息到页面,只需要利用“取未读消息数”来显示提醒有未读消息即可,然后用户主动通过刷新页面来**“拉取”**未读消息,刷新页面时已经拿到过的消息不希望再重新拿一遍。

5.我们原来担心用户刷新页面的时候直接调用LeanMessage REST API取消息的性能问题,所以考虑将用户最近的消息(比如100条)利用LeanCache来缓存(Redis有List数据结构,很容易用链表形式为每个用户有序的保存消息),可以大大提升用户刷新页面的速度。

问题:系统会话中的消息,如何按用户缓存到LeanCache中(按用户是担心某些用户消息太多,占用了过多的缓存,所以希望限制每个用户缓存的消息数量)

问题很多,望您拨冗回答,感谢!
--