从Web API发布到消息队列
本文关键字:消息 队列 Web API | 更新日期: 2023-09-27 18:15:01
我有一个ASP。Net Web Api应用程序,使用实体框架更新数据库中的一些实体。当某些更新时,我计划将更新的内容发布到Azure服务总线队列,然后由其他系统拾取和处理。
我不太确定如何启动将消息从Web Api添加到队列的过程。我知道在api中返回响应后我不能做太多,所以不确定是否要运行代码,或者可能引发事件。但是我不希望有一个消息队列来向主队列添加消息。
我不希望这影响到对用户的响应时间,所以我想异步执行。什么好主意吗?
微软在Azure Center中有一些关于设计模式和参考架构的链接。
如果您不想影响用户的响应,我会将消息转储到服务内部队列,并将这些消息发送到单独工作线程上的服务总线。如果消息传递是必需的,那么这可能是一个很好的策略,因为您可以保存数据并在必要时重新访问它。
我知道你说你不想影响响应时间,但确实希望将消息作为HTTP控制器动作的一部分传递。以下是一些注意事项:
- 相对于Azure队列,您的API安装在哪里?两者都在Azure中吗?服务是否位于同一地点?
- 如果交付到Azure服务总线失败,是否需要通知调用者?
- 您是否在控制器内部执行任何其他依赖于发布到服务总线的结果的处理? 应该支持重试吗?
如果#1类似于"是",那么我建议您可以将向服务总线发布的操作包装在Task中,并根据该任务的结果(以及您正在执行的任何其他处理)确定自己的结果。如果有多个场景,并且第一条是肯定的,那么您还可以考虑使用两个模块来实现一个公共接口,但本质上使用不同(安装)场景的策略模式。
如果您没有与Azure共存,或者期望在任何时候与Azure共存,那么值得考虑使用本地队列来发布消息,并生成某种worker来处理该队列上的消息。您可能会发现这提供了用户体验和可靠性的最佳权衡。