保证消息的单次推送

问题描述 投票:0回答:1

给出:

  1. 我不是经验丰富的队列用户
  2. SQL Server表MessagesToPush
  3. RabbitMq交换到单个队列(或多个队列-我认为在这里并不重要)
  4. c#程序,应该从MessagesToPush中读取并发送该消息以进行一次准确的交换(如果您知道某种在兔子方面实施的方法-告诉我,我可能会丢失一些东西)
  5. 算法:
    • 获取未发送状态的记录(为简单起见,我们不在乎并发,批量处理等,这里及以后的内容)
    • 发送/提交给兔子交换
    • 更新数据库中的行状态(设置状态='已发送')
    • 重复

[这里有些精神障碍我无法超越-很明显,例如,如果我们在提交到交换和数据库提交之间挂起,就会遇到问题。在这种情况下,我们可以发送两次消息。是的,我们可以在消费者方面实施双打检查-但在许多方面都非常昂贵。所以这是我的问题:有没有一种好的方法来确保subj

c# sql sql-server transactions rabbitmq
1个回答
0
投票
恰好一次交货。没关系,它与实际发送的邮件无关,这一事实-您指的是在问题中传递到邮件代理,因此原理是相同的。

Exactly once delivery is mathematically impossible

为什么?考虑将文本发送给不可靠的朋友(我们都有)的情况。该特定朋友的消息阅读通知已禁用。您发短信给他看他是否有空吃晚饭。您需要等待几分钟才能得到答复。他没有回应。发生了什么?

他是否收到您的消息并忽略了(因为他很容易这样做)?如果是这样,也许他不想被打扰。再发送一条消息可能会惹恼他。您是否仍要再次发送消息?

也许他没有收到您的消息,即使iPhone指示消息已成功发送。您原本计划在晚餐上用餐,但如果他没有收到晚餐,现在看来

您真是个无礼的人。

    这是
  • 至少一次传递语义
  • 的示例。您的消息可能已经传递也可能尚未传递,但如果已传递,则只会传递一次。
  • Next,考虑您的短信根本无法发送的情况。您的电话在消息旁边显示小(!)图标。您点击它,然后点击“再次发送”按钮。这是

    至少一次传递语义。

    的消息,该消息实际上可能是第一次经过,也可能没有,但是您的电话指示错误,然后您再次发送。您不知道,现在已发送了消息的两个副本。

    那又是什么?

    在现实世界中,人类通常善于处理重复信息。因此,对我们来说,至少一次交货通常是可以接受的。人类通常非常善于适应不可靠信使的现实。不幸的是,您必须找出答案,才能知道邮件是否已发送。

    底线

    :如果保证交付很重要,请围绕至少一次交付语义设计系统。
  • © www.soinside.com 2019 - 2024. All rights reserved.