首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >AWS中的MassTransit

AWS中的MassTransit
EN

Stack Overflow用户
提问于 2022-08-18 00:04:46
回答 1查看 114关注 0票数 0

我正在使用MassTransit v7和运行在Aws Lambda上的Asp.Net核心,我想升级到v8。我想知道在无服务器环境中使用MassTransit的正确方法是什么。

我看到的问题是背景/托管服务以及MassTransit如何使用它们。根据我的理解,后台服务在Aws Lambda环境中不能正常工作,应该避免使用。

“常见错误”一节规定,公共汽车必须始终启动:

创建总线实例仅用于发送或发布消息时,必须启动该实例。不发动公共汽车可能会产生一些奇怪的副作用。每条总线,即使是没有接收端点的总线,都必须启动(并最终停止)。

随着对v8的更改,MassTransit似乎会自动为MassTransit添加一个IHostedService并启动它。

由于总线被用作托管服务,可能会出现发布操作不发送消息的情况。简单地说,当http请求结束时,Lambda将停止执行,但在后台服务实际处理和发送消息之前。

MassTransit和Lambda的另一个问题是,目前,Aws Lambda的性质要求我们将每个项目拆分成多个Lambda,例如:

  1. Api应用- Asp.net核心api
  2. 处理来自代理的消息的本机lambda。它们是基于MassTransit蓝宝石样品。

广告。1)接收http请求和发布消息的API应用程序。首先,它不应该使用任何消息。此lambda只在http请求的上下文中工作。当请求结束并在后台接收到消息时,可能会导致奇怪的结果。

其次,无论何时发布消息,它都应该同步执行,等待总线的响应,而不是通过后台服务进行响应。后台服务在此环境中不能正常工作。

广告。2)与MassTransit lambda样品非常相似。不同之处在于,在处理事件时,我们还希望发布消息:

代码语言:javascript
复制
public class SubmitOrderConsumer : IConsumer<SubmitOrder>
{
    public Task Consume(ConsumeContext<SubmitOrder> context)
    {
        Console.WriteLine("YUS");
        // TODO: write something to S3
        // ...
        // PUBLISH / SEND with MassTransit
        return Task.CompletedTask;
    }
}

同样的规则也适用于这里。不应该有委托给后台线程的操作。

是否有一种方法可以在没有后台服务的情况下配置和使用MassTransit并使用同步发布?还是我误解了一些基本概念?

EN

回答 1

Stack Overflow用户

发布于 2022-08-18 04:07:03

我在这里猜测,但由于您只想通过MassTransit发布消息,使用接收端点分派程序链接的示例应该适合您。任何通过ConsumeContext<T>发布的消息都应该发布,只要等待Publish调用(发布不是在后台完成,它只是异步)。

您只需添加以下内容:

代码语言:javascript
复制
x.UsingAmazonSqs((context, cfg) => { /* configure host */ });

而不是UsingInMemory

因为AWS都是隐藏的HTTP调用,没有任何持久的套接字,所以应该可以。请注意,我之所以这么说是因为SQS是如何工作的(也包括SNS )。因为它都是HTTP,而且没有接收端点,所以不启动总线不应该造成任何负面影响。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73396105

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档