我应该发布或发送此方案的消息吗?

时间:2016-05-07 10:45:53

标签: nservicebus publish-subscribe servicebus rebus shuttle

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

现在我看到了几个不同的选择:

  1. Web服务器将保留反馈(异步数据库调用)并在总线上发布FeedbackCreated事件。
  2. Web服务器将在总线上发送SendFeedback命令,终点将有一个消息处理程序,该处理程序持久保存反馈并发布将由同一端点处理的FeedbackCreated事件(或者我应该为此发送两个本地消息电子邮件???)
  3. Web服务器将在总线上发送SendFeedback命令,终点将有一个启动并接管的传奇。
  4. 所以我想我是否感到困惑,如果反馈被持久化到数据库后我应该发布一个事件还是发送两条消息(将在本地处理)?请不要该消息没有电子邮件的所有信息,因此需要查找其他信息。

    谢谢!

1 个答案:

答案 0 :(得分:2)

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

首先,我会尝试避免访问数据库并从单个Web请求中发布到总线。你在Web请求中做得越少越好 - 并且通过总线发送单个消息通常是你可以做的最安全的事情,因为它不会查找订阅者,它不会遇到死锁一个数据库,它通常不受其他任何因素的影响。

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

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

然后你可以拥有相同的端点(或者另一个,并不重要)订阅FeedbackCreated,然后在那里做几个处理程序来做他们需要做的事情SmtpClient

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

我希望这是有道理的:)