我知道对于分布式和顺序服务,我们正在使用 RoutingSlip courier。想象一下,我有一个场景,我想要一个请求发布者,我们将其命名为 apiPublisher,它想要调用 dbMicro 来获取一些数据,然后调用另一个 Micro 来做一些事情,然后调用 dbmicro 在那里插入新数据,最后返回回复我的出版商。所以我要创建一个路线和类似的活动:
private RoutingSlip CreateRoutingSlip(ConsumeContext<AccountModel> context)
{
var builder = new RoutingSlipBuilder(NewId.NextGuid());
builder.AddSubscription
(context.ReceiveContext.InputAddress,
RoutingSlipEvents.Completed
| RoutingSlipEvents.Faulted);
builder.AddVariable("AccountId", context.Message.AccountId);
builder.AddVariable(nameof(context.RequestId), context.RequestId);
builder.AddVariable(nameof(context.ResponseAddress), context.ResponseAddress);
builder.AddVariable(nameof(context.FaultAddress), context.FaultAddress);
builder.AddVariable("Request", context.Message);
var dbQueueName = _formatter.
ExecuteActivity<SetAuthenticatedRequestWithDbActivity, AccountModel>();
builder.AddActivity(nameof(SetAuthenticatedRequestWithDbActivity)
, new Uri($"queue:{dbQueueName}"), new
{
AccountId = context.Message.AccountId,
});
var apiQueueName = _formatter.ExecuteActivity<CallCampaignTpTestMicro, SpecialOfferActivePackageRequestModel>();
builder.AddActivity("specialOffer", new Uri($"queue:{apiQueueName}"), new
{
TelNum = "09195847189",
OfferId = "1",
ChoiceNo = "1",
Gateway = context.Message.Gateway,
HeaderNo = "1",
ChannelId = "1",
});
//next activity ...
var dbResult = new AccountModel()
{
AccountId = context.Message.AccountId,
};
builder.AddVariable("Model", dbResult);
return builder.Build();
}
现在我想知道如果我只是简单地在调用对方之后在消费者中调用每个这个微控制器有什么区别,例如这样做:
var massResult= await _massClientRequest.GetResponse<AuthenticatePaymentResponeModel>
(new AuthenticatePaymentRequestModel
{
AccountRequest = context.Arguments.AccountRequest,
MyRequestedUrl = context.Arguments.MyRequestedUrl,
UserId = context.Arguments.UserId,
});
var res = massResult.Message;
var nextMasResult = await _massClientRequest.GetResponse<PaymentBankResponseModel>
(new PaymentBankRequestModel
{
BankeName = bankeName,
MyRequestUrl = context.Arguments.MyRequestUrl,
NewUrl = context.Arguments.NewUrl,
});
var 2ndRes= nextMasResult.Message;
if (2ndRes.IsSuccess){
var lastMasResult = await _massClientRequest.GetResponse<mymodel>
(new mymodelReq
{
BankeName = bankeName,
MyRequestUrl = context.Arguments.MyRequestUrl,
NewUrl = context.Arguments.NewUrl,
});
这个场景是不是运行得不太顺利?第一种方法有什么好处。
路由滑动模式是一个saga(在本文的原始意义上),它提供了额外的功能,包括:
还有一个
RoutingSlipRequestProxy
和 RoutingSlipResponseProxy
可用于为路由单交易提供标准请求客户端入口点。这允许原始 API 使用请求客户端发起事务,然后将该事务的成功/失败作为结果/错误组合(或结果/不良结果对)进行处理。