Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/meteor/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Design patterns 如何确保在分布式系统中至少有一次通知?_Design Patterns_Architecture - Fatal编程技术网

Design patterns 如何确保在分布式系统中至少有一次通知?

Design patterns 如何确保在分布式系统中至少有一次通知?,design-patterns,architecture,Design Patterns,Architecture,假设我有一个日历事件: calendar_event ( id UUID, start_time timestamp, end_time timestamp, ... ) 我允许用户为这些事件创建通知 notification ( id UUID, event_id UUID, # the id of the event in calendar_event notification_time timestamp, # the t

假设我有一个日历事件:

calendar_event (
    id UUID,
    start_time timestamp,
    end_time timestamp, 
    ...
)
我允许用户为这些事件创建通知

notification (
     id UUID, 
     event_id UUID, # the id of the event in calendar_event
     notification_time timestamp, # the time the notification should be sent
     notification_sent boolean DEFAULT false, # true if the notification has been sent
)
这个应用程序的使用率足够高,我有多个节点(例如restful java应用程序)处理创建事件、创建通知和删除通知等,并将这些数据存储在一些数据库中,例如MySQL

让我们也假设我按时发送通知是至关重要的,并且用户能够在不久的将来更新通知

如何确保每个通知至少发送一次?


我们可以有另一个每分钟轮询一次的应用程序,然后发送通知,但如果该应用程序宕机一段时间,我们就会错过通知。如果我们使用布尔字段将通知标记为已发送,那么我们可以赶上,但可能会迟到。如果我们正在存储下一分钟,并且一个通知被删除,因此不应该发送,我们将在不应该发送通知时发送通知

我想起了一个队列,但有一些不同的属性;我们需要按通知时间排序,而不是按插入时间排序,并且需要允许删除

如何确保分布式系统中至少有一次通知 系统

有很多方法可以实现这一点,但考虑到您的场景,队列是一个简单的选择。您的要求是通知的可靠性,您可以在您的情况下将消息(通知)发送到多个队列,您可以尝试使用主队列,如果失败,则发送到辅助队列。在读取端,如果从辅助队列读取失败,可以尝试主队列。此外,您还必须确保队列位于不同的硬件/机器等上。这样您就可以避免硬件故障。根据您的基础平台,Azure、AWS或Google等云平台可以帮助您实现可靠的队列

我们需要 要按通知时间排序,而不是按插入时间排序,我们需要允许 删除

在这里,因为您有“创建通知”的“多个节点”,所以您可以使用简单的管道和过滤器体系结构,这样您可以首先将消息泵入未排序的队列,然后其他处理器可以拾取这些消息并将其插入已排序的队列。这将增加另一层或可靠性/故障,无论您如何看待它。然而,这意味着sour分拣处理器是独立的,并且可以独立扩展。
如果需要,您还可以使用分拣机将消息泵入数据存储而不是队列。同样,所有这些都将取决于可靠性要求以及您想投入多少时间、精力和金钱。

为什么您对排队犹豫不决?这是正确的方法,您只需要延迟排队(或者自己实现,这并不难)、持久性和删除(或者跳过传统消息代理的消费)我对队列并不犹豫。只是您的典型队列没有正确的语义,您必须做一些额外的工作来处理排序。直到我做了更多的搜索,我才知道延迟队列。是的,这是我在周末得出的结论。我提议的体系结构将是一个Kafka(因为我们可以重新总结)主题,由使用java.util.concurrent.DelayQueue的应用程序使用,然后在适当的时间重新发布它们。不过,仍然有一些方法会被发现,尽管这些方法可以解决(需要检查启动时是否发送了通知),但它们是可以解决的。