我创建了微服务发送多个通知,如电子邮件,短信等,这是消费kafka的通知。我希望像免打扰这样的用户首选项被视为用户不应该在指定的免打扰期限内收到通知。
我如何才能获得免打扰功能,因为kafka会不断地向我发送带有时间戳(发送消息的日期和时间)的消息,并确认用户在订阅的免打扰期间不会收到这些通知?
我能得到一些帮助吗?
发布于 2020-08-27 17:39:11
我没有完全使用Kafka的经验,但我对微服务架构和消息队列有一定的了解。
由于微服务正在消费队列或Kafka中的任务,因此可以在消费微服务中实现DND。它可能需要执行其他任务来检查用户是否处于免打扰状态,然后发送通知。
然而,微服务是特定于任务的,最好是直接发送通知,因此可以修改将任务发布到Kafka的应用程序/微服务。
微服务A -> Kafka ->通知微服务(B)
微服务A可以在传递给Kafka之前检查DND或
微服务A可以将用户免打扰时间段信息与其他通知详细信息一起附加到Kafka。现在,当B从Kafka接收/消费时,它会检查它是否在DND周期内,否则将干脆忽略它。
-在第一条评论后添加
我认为DND中的通知可以被丢弃。以下是我们可以在稍后发送通知的操作。
-答案基于上述架构
要在以后发送通知而不丢弃它,您可以创建另一个本地队列(数组或任何可行的数据结构)或使用内存中的队列,如Redis。
现在,基于我之前的建议,现在我们可以避免发送通知,并将其放入新创建的队列中,而不是丢弃落在免打扰中的通知。
微服务B可以有一个调度程序,比方说每15分钟。
另外,假设如前所述,通知将具有DND参数(由于此队列包含已跳过的通知,因此不再需要或不再需要发送的实际时间)
现在,每隔15分钟(或设置的任何时间),微服务B可以检查该队列的内容&仅当该队列不在DND时才发送通知,并最终将其从队列中删除。
如果时间仍处于免打扰状态,我们将通知保留在队列中而不删除它,因此它将在15分钟后再次拾取以进行处理(设置的时间)。
最后,如果B已经超载,我们可以创建另一个简单的微服务,如果通知在DND内,它将每15分钟检查一次这个新队列,并将其传递给微服务B以发送实际的通知。
发布于 2020-08-27 18:51:48
您可以在使用来自通知主题的消息后,根据免打扰逻辑来分隔消息。发帖说你可以把它写回另一个卡夫卡主题,说dnd-notifications,然后从那里阅读。由于Kafka用于exactly-once传递,您将不得不将您的免打扰消息推送到一个新的主题。
编辑-26-9月:
在事后看来,把你的免打扰通知放在一个单独的主题中是行不通的,比如“如果一个用户的免打扰期限超过7天怎么办”。Kafka默认消息保留时间为7天(您可以增加),但kafka不用于存储。
您需要做的是涉及一个数据库并拥有两个微服务。一个微服务将是一个消费者微服务,它将读取kafka并将消息写入数据库中带有标志的表(即is_read,如果消息已经推送到用户并读取,则为true )。默认情况下,对于任何新消息,is_read都将为false。
第二个微服务将实际推送通知,同时考虑到用户的免打扰配置。它应该从数据库中读取所有未读的消息表,检查用户的dnd-config,然后推送给用户。该第二服务可以定期轮询db并发出未读消息。

https://stackoverflow.com/questions/63612797
复制相似问题