在微服务架构中,假设有一个业务场景,其中用户购买了将在两年后过期的东西,系统需要提前一点通知用户。
在这种情况下,我们应该如何处理这种情况,以便即使有许多用户需要通知,也可以及时通知用户?
例如,使用消息队列的延迟队列将导致当有许多用户时消息堆积;使用定时任务时,太多的用户将使服务器CPU过载。
有什么好方法可以做到这一点吗?
发布于 2021-04-16 16:55:25
虽然“微服务”本质上并不意味着"REST",但它们通常是。在REST中,您不应该在内存中存储任何需要在多个请求中幸存下来的内容。两年是一个极端的情况,但即使只有10分钟,它可能也应该去DB。
发布于 2021-04-16 17:18:29
建立两年的队列将是非常不切实际的,如果队列内容没有保存在某个地方,很可能会失败。既然您提到了购买,我假设您有某种类型的数据存储来用sql或非sql记录它们。
您只需将购买日期/时间列添加到表格中即可,使您的工作更轻松。如果你的数量足够低,每天购买,那么我会开始与日期为基础的查找只。您将需要某个服务方法的计划执行,例如在每天早上6点查找即将到期的采购,即2年前7天的purchase_date = now - 723days,然后发送rest请求到某个地方,或者发布一个事件或jms消息,将订单号和purchase_date作为每个采购订单的内容。然后由某处的事件/消息侦听器拾取,并进行相应处理,即向客户发送通知。为了避免发送重复的通知,您还应该将过期通知保存在数据库中,并确保在再次发送之前检查是否已发送购买id的通知。
如果您曾经遇到过这样的情况,即您每天要处理数千个订单,并且不想一下子发布大量事件,那么可以扩展该功能,根据购买时间戳进行过滤,并通过更改查找条件一天多次处理大量购买。
这只是这些需求的一般概念,您将不得不细化许多实现细节,例如如果您的电子邮件服务器停机会发生什么情况。
发布于 2021-04-20 08:41:27
您可以使用quartz job并将其配置为在数据库(JDBC JobStore)中使用持久模式,以避免丢失信息,而且它也适用于集群模式。
Quartz定期检查数据库中最近的任务(可配置参数),如果时间到了,它将处理通知。
您可以配置线程池的大小,以避免过载。
https://stackoverflow.com/questions/67121550
复制相似问题