我应该为这种情况发布或发送消息吗?
Should I publish or send message for this scenario?
我来晚了,所以我对这个简单的场景有点困惑。我有一个带有反馈表的网站,当用户发送他们的反馈时,我的业务需求状态我需要保留反馈以用于报告目的,向产品经理发送电子邮件,并向发件人发送感谢电子邮件。
现在我看到几个不同的选项:
- Web 服务器将保留反馈(异步数据库调用)并在总线上发布 FeedbackCreated 事件。
- Web 服务器将在总线上发送 SendFeedback 命令,端点将有一个消息处理程序,该消息处理程序保留反馈并发布将由同一端点处理的 FeedbackCreated 事件(或者我应该发送两条本地消息对于电子邮件???)
- Web 服务器将在总线上发送 SendFeedback 命令,端点将有一个 saga 启动并接管。
所以我想我很困惑,在将反馈保存到数据库后,我应该发布一个事件还是发送两条消息(将在本地处理)?请注意,该消息没有包含电子邮件的所有信息,因此需要查找其他信息。
谢谢!
如您所述,可以通过多种方式实现此流程。我会告诉你我更喜欢哪一个,然后说几句为什么:)
首先,我会尽量避免在单个 Web 请求中访问数据库并发布到总线。在 web 请求中你能逃脱的越少越好——用总线发送一条消息通常是你能做的最安全的事情,因为它不会查找订阅者,它不会 运行陷入数据库死锁,通常不会受到其他任何影响。
因此,我会await bus.Send(new CreateFeedback(...))
然后网络请求就结束了。
在后端我可能会实施你的第二个选项,即有一个 IHandleMessages<CreateFeedback>
将反馈保存到数据库,一旦完成它肯定可以 await bus.Publish(new FeedbackCreated(...))
.
然后您可以让相同的端点(或另一个端点,并不重要)订阅 FeedbackCreated
,然后让几个处理程序在那里做他们需要做的任何事情 SmtpClient
。
请注意,如果您在同一个端点处理事件,您绝对可以有两个单独的处理程序,但它们不能 succeed/fail 彼此独立。这可能需要让两个单独的端点订阅 FeedbackCreated
事件。
我希望这是有道理的:)
我来晚了,所以我对这个简单的场景有点困惑。我有一个带有反馈表的网站,当用户发送他们的反馈时,我的业务需求状态我需要保留反馈以用于报告目的,向产品经理发送电子邮件,并向发件人发送感谢电子邮件。
现在我看到几个不同的选项:
- Web 服务器将保留反馈(异步数据库调用)并在总线上发布 FeedbackCreated 事件。
- Web 服务器将在总线上发送 SendFeedback 命令,端点将有一个消息处理程序,该消息处理程序保留反馈并发布将由同一端点处理的 FeedbackCreated 事件(或者我应该发送两条本地消息对于电子邮件???)
- Web 服务器将在总线上发送 SendFeedback 命令,端点将有一个 saga 启动并接管。
所以我想我很困惑,在将反馈保存到数据库后,我应该发布一个事件还是发送两条消息(将在本地处理)?请注意,该消息没有包含电子邮件的所有信息,因此需要查找其他信息。
谢谢!
如您所述,可以通过多种方式实现此流程。我会告诉你我更喜欢哪一个,然后说几句为什么:)
首先,我会尽量避免在单个 Web 请求中访问数据库并发布到总线。在 web 请求中你能逃脱的越少越好——用总线发送一条消息通常是你能做的最安全的事情,因为它不会查找订阅者,它不会 运行陷入数据库死锁,通常不会受到其他任何影响。
因此,我会await bus.Send(new CreateFeedback(...))
然后网络请求就结束了。
在后端我可能会实施你的第二个选项,即有一个 IHandleMessages<CreateFeedback>
将反馈保存到数据库,一旦完成它肯定可以 await bus.Publish(new FeedbackCreated(...))
.
然后您可以让相同的端点(或另一个端点,并不重要)订阅 FeedbackCreated
,然后让几个处理程序在那里做他们需要做的任何事情 SmtpClient
。
请注意,如果您在同一个端点处理事件,您绝对可以有两个单独的处理程序,但它们不能 succeed/fail 彼此独立。这可能需要让两个单独的端点订阅 FeedbackCreated
事件。
我希望这是有道理的:)