代码改变世界

译MassTransit 消息契约

2018-05-21 16:58  李明成  阅读(834)  评论(0编辑  收藏  举报

消息契约

在MassTransit中,使用.NET .NET系统定义消息契约。消息可以使用类和接口来定义,但是,建议类型使用只读属性而不使用行为。

注意:强烈建议使用消息接口的接口,基于多年的经验,具有不同级别的开发经验。MassTransit 将为消息创建动态接口实现,确保消息契约与消费者的干净分离。

下面显示了一个更新客户地址的示例消息。

namespace Company.Application.Contracts
{
using System;

public interface UpdateCustomerAddress
{
Guid CommandId { get; }
DateTime Timestamp { get; }
string CustomerId { get; }
string HouseNumber { get; }
string Street { get; }
string City { get; }
string State { get; }
string PostalCode { get; }
}
}

工程师在消息传递方面的一个常见错误是为消息创建基类,并尝试在消费者中分配基类——包括子类的行为。哎哟。这总是导致痛苦和痛苦,所以对基类说“不”。

指定消息名称
有两种主要的消息类型:事件和命令。当选择一个消息的名称时,消息的类型应该指定消息的时态。

命令

命令告诉服务做某事。命令(使用Send)发送到端点,因为预期单个服务实例执行命令操作。命令不应该发布。

命令应该以动词-名词顺序来表达,遵循the_tell_style风格
示例命令:

  • UpdateCustomerAddress
  • UpgradeCustomerAccount
  • SubmitOrder

 

事件

事件意味着某事发生了。事件(使用Publish)使用IBus 或ConsumeContext 发布。事件不应直接发送到端点。

事件应以名词-动词 (过去时态) 序列表示, 表明发生了某事。 

示例事件:

  • CustomerAddressUpdated
  • CustomerAccountUpgraded
  • OrderSubmitted, OrderAccepted, OrderRejected, OrderShipped

消息相关性
由于消息通常不是孤立的,发布一条消息通常会导致发布另一条消息,然后再发布另一条消息,等等。跟踪这些序列是有用的,然而,要找到它们,需要有一些信息详细描述它们是如何相互关联的。

相关性是将消息连接在一起的原理,通常是通过使用在逻辑序列的一部分中包含的唯一标识符。在MassTransit 中,唯一标识符被称为CorrelationId,它包含在消息信封中,并通过ConsumeContext 或SendContext提供。MassTransit 还包括一个会话ID,在整个相关消息集合中都是相同的。

MassTransit 支持不同的方法来指定相关性。查看消息相关性文章以获取更多信息。