【问题标题】:Should I publish or send message for this scenario?我应该为这种情况发布或发送消息吗?
【发布时间】:2016-05-07 10:45:52
【问题描述】:

我来晚了,所以我对这个简单的场景有点困惑。我有一个带有反馈表的网站,当用户发送他们的反馈时,我的业务需求状态是我需要保留反馈以用于报告目的,向产品经理发送电子邮件,并向发件人发送感谢电子邮件。

现在我看到了一些不同的选项:

  1. Web 服务器将保留反馈(异步数据库调用)并在总线上发布 FeedbackCreated 事件。
  2. Web 服务器将在总线上发送一个 SendFeedback 命令,并且端点将有一个消息处理程序,该消息处理程序保持反馈并发布一个由同一端点处理的 FeedbackCreated 事件(或者我应该为电子邮件???)
  3. Web 服务器将在总线上发送一个 SendFeedback 命令,并且端点将有一个 saga 启动并接管。

所以我想我很困惑在反馈被持久化到数据库之后我应该发布一个事件还是发送两条消息(将在本地处理)?请注意,该消息没有电子邮件的所有信息,因此需要查找其他信息。

谢谢!

【问题讨论】:

    标签: nservicebus publish-subscribe servicebus rebus shuttle


    【解决方案1】:

    正如您已经说过的,有几种方法可以实现此流程。我会告诉你我更喜欢哪一个,然后说几句为什么:)

    首先,我会尽量避免在单个 Web 请求中访问数据库并发布到总线。你在网络请求中做的越少越好——用总线发送一条消息通常是你能做的最安全的事情,因为它不会查找订阅者,也不会陷入僵局一个数据库,它通常不会受到其他任何东西的影响。

    因此,我会await bus.Send(new CreateFeedback(...)),然后网络请求就会结束。

    在后端我可能会实现你的第二个选项,即有一个 IHandleMessages<CreateFeedback> 将反馈保存到数据库,一旦完成,它肯定可以 await bus.Publish(new FeedbackCreated(...))

    然后,您可以让相同的端点(或另一个端点,并不重要)订阅FeedbackCreated,然后让几个处理程序在那里执行他们需要做的任何SmtpClient 的事情。

    请注意,如果你在同一个端点处理事件,你肯定可以有两个独立的处理程序,但它们不能独立地成功/失败。这可能需要让两个单独的端点订阅FeedbackCreated 事件。

    我希望这是有道理的:)

    【讨论】:

    • 完美的 thx 芽是有道理的!现在假设我也需要做的就是将一条记录写入数据库。例如公告。如果用户正在查看记录网格,然后使用总线创建一个新记录,由于最终的一致性,大多数情况下网格不会显示新记录。你通常如何处理这个?你会在 Web 请求期间写信给分贝吗?训练您的用户了解他们可能过于刷新页面?
    • 是的,您可能无法始终只发送一条消息。所以对于需要更新本地数据的场景,我肯定会继续这样做。
    • 好答案@mookid8000。 Marco,关于最终的一致性部分,像 Angular 这样的 UI 框架真的可以在这里提供帮助。 UI 框架可以在浏览器内部建立状态,而不是直接调用数据库或“训练访问者进行刷新”。将新行存储在那里,刷新整个页面后,该行可能已经来自数据库。与缓存相同。您可能已经在使用缓存,您如何处理那里的陈旧数据?数据库中的数据,但尚未在您的缓存中?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-01-28
    • 2011-01-17
    • 2022-07-22
    • 1970-01-01
    • 1970-01-01
    • 2013-05-16
    • 1970-01-01
    相关资源
    最近更新 更多