簡體   English   中英

如何實現同步。 從 RabbitMQ 調用 .NET 核心微服務架構?

[英]How to achieve synch. call from RabbitMQ in .NET Core microservice Architecture?

  1. 在我的項目中,需要以同步方式進行服務間通信。 無論如何,我們可以使用 RabbitMQ 或任何其他異步方法以同步方式在兩個微服務之間進行通信嗎?

  2. 或者以下建議有任何其他含義? “如果您的微服務需要在另一個微服務中引發額外的操作,如果可能,請不要同步執行該操作並將其作為原始微服務請求和回復操作的一部分。相反,異步執行(使用異步消息傳遞或集成事件、隊列、等)。但是,盡可能不要將動作作為原始同步請求和回復操作的一部分同步調用。” 參考

我嘗試了 gRPC 和依賴項添加方法,通過以下鏈接還有其他方法可用於同步通信嗎?

  1. https://docs.abp.io/en/commercial/latest/startup-templates/microservice/synchronous-interservice-communication
  2. https://www.c-sharpcorner.com/article/crud-operation-and-microservice-communication-using-grpc-in.net-core-6-web-api/

如果您在 RabbitMQ 上使用公共交通,那么您只需按照以下步驟操作即可。
假設我們想觸發事件以提交帶有響應的訂單(如您所說的同步方式)。
首先我們有訂單消息model或者接口。 我更喜歡界面。

public interface ISubmitOrder
    {
        Guid Id { get; set; }
        DateTime TimeStamp { get; set; }
        public string CustomerId { get; set; }
    }

和響應模型/接口,因為你想要響應。

public interface IOrderSubmisstionResponse
    {
        Guid Id { get; set; }
        DateTime TimeStamp { get; set; }
        public string CustomerId { get; set; }
    }

這是回應的消費者

public class SubmitOrderConsumer : IConsumer<ISubmitOrder>
    {


        private readonly ILogger<SubmitOrderConsumer> _logger;

        public SubmitOrderConsumer(ILogger<SubmitOrderConsumer> logger)
        {
            _logger = logger;
        }

        public async Task Consume(ConsumeContext<ISubmitOrder> context)
        {

            _logger.Log(LogLevel.Debug, $"Order Info( customer Id : {context.Message.CustomerId})");


            await context.RespondAsync<IOrderSubmisstionResponse>(new {

                TimeStamp = InVar.Timestamp,
                CustomerId = context.Message.CustomerId,
                Id = context.Message.Id
            
            });
        }
    }

Container 中的公共交通配置

builder.Services.AddMassTransit(options =>
{

    options.AddConsumer<SubmitOrderConsumer>();

    options.UsingRabbitMq((ctx, conf) =>
    {
        conf.Host("amqp://guest:guest@localhost:5672");
        conf.UseMessageRetry(r => r.Immediate(2));
        conf.ConfigureEndpoints(ctx);
    });


    options.AddRequestClient<ISubmitOrder>();

});

注入 IRequestClient

 private readonly IRequestClient<ISubmitOrder> _requestClient;

這就是開火的方式

var result = await _requestClient.GetResponse<IOrderSubmisstionResponse>(new
            {
                Id = Id,
                TimeStamp = InVar.Timestamp,
                CustomerId = CustomerId
            });

公共交通請求文檔
Chris Paterson 的精彩教程


在服務之間使用異步通信的原因是為了保持它們的獨立性和原子性,因此彼此之間是匿名的。 這也有助於即使由不同的團隊獨立維護和開發服務。 然而,有時同步通信變得不可避免,因此在這種情況下,考慮到服務耦合注意事項,可能會有 rest 或 rpc 通信。

無論如何,我們可以使用 RabbitMQ 或任何其他異步方法以同步方式在兩個微服務之間進行通信嗎?

您可以使用遠程過程調用 (RPC)模式。 簡而言之,發布者發布一條消息,然后在指定隊列中等待響應,其中帶有一些標記,表明這是對此特定請求的響應(例如使用CorrelationId ),並將該特定消息標記為已處理。

任何其他方法可用於同步通信

是的,您可以使用“傳統” Web API 方法,例如 REST/OpenAPI/OData/GraphQL。 就個人而言,當需要同步通信時,我更喜歡這些方法中的一種(包括 gRPC),而不是通過異步消息傳遞模擬同步調用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM