4
回答
请教一个消息列队用法
终于搞明白,存储TCO原来是这样算的>>>   

大家好,

请教一个消息列队的用法。

比如用户录入;更新了一个新的数据,我首先插入;更新缓存系统(redis)。

然后new一个db消息任务,后台有监听进程,拿到这个任务后,同步到数据库,有2中做法:

第一种是 从缓存取出这个数据,进行数据库同步。

第二种是 任务里面带着数据,任务直接取出来同步,不需要从缓存拿。

我现在的做法是第二种,因为比较灵活,比如局部更新,只需要某些字段的数据即可。缺点是任务的消息比较大,可能在MB级别。

打算做一些改进,任务里面存需要修改的字段,不存数据,拿到这个消息后,从缓存取需要的字段,然后做同步。

想听听大家的看法,或者我的方案有什么需要改进的。

<无标签>
举报
Grrrr
发帖于3年前 4回/464阅
共有4个答案 最后回答: 3年前
推荐第一种,我的想法是消息队列只用来传递消息的header,body部分在producer和consumer端进行write和read,尤其body比较大的时候。
--- 共有 1 条评论 ---
Grrrr恩· 已经改好了,从缓存取,然后同步数据库 3年前 回复
缓存的功能就在此,如果不用岂不是浪费,推荐第一种
--- 共有 3 条评论 ---
Grrrr回复 @Gillian_Male : 缓存挂掉的话,任务会被踢回,重新调度,而且我后台就一个进程来消耗任务,顺序一致,所以数据最终会一致性的。 3年前 回复
Gillian_Male回复 @Grrrr : 如果是同步数据我还是强烈建议从传统的关系数据库同步到缓存数据库,避免数据丢失 3年前 回复
Grrrr恩· 已经改好了,从缓存取,然后同步数据库。 3年前 回复

万一在队列执行之前, redis 挂掉了.那么这条数据是否会有丢失的风险?

对 redis 还不是很了解,但是我平时了解的项目都是先更新数据库,redis里面会根据时间戳定时去数据库反向同步.

--- 共有 1 条评论 ---
Grrrr有可能的,简单点的做法是 把任务踢还到任务系统,表示这个任务运行失败,等待下次调度。如果redis一直起不来,任务永远不会运行,所以不用担心数据一致性的问题。 3年前 回复
顶部