入门
NServiceBus服务总线
运输
坚持不懈
服务洞察力
服务脉冲
服务控制
监测
样品

信息

消息传递通常用于系统内各个组件之间的通信和协调。消息传递在实现构建解耦和可靠的分布式体系结构所需的灵活、健壮和可扩展的进程间协调方面发挥着关键作用。消息传递的基本原则和模式已有数十年历史,经过无数技术变革的考验。

信息系统

消息代理(如RabbitMQ、Azure Service Bus或Amazon SQS)可以与数据库进行比较,但它不是存储数据并对其进行索引,而是将数据从一个组件传输到另一个组件。组件调用API发送消息,API在收到消息后进行响应。此时,调用组件不再关心向其他组件传递消息。这是经纪人的责任。

由于消息传递的异步特性,调用组件不知道接收组件可能存在的问题;消息一发送,消息传递基础结构就接管了任务。因此,线程等关键资源不会等待消息处理完成。这允许调用组件在等待另一个组件的响应时保持稳定性,该组件可能正在单独的进程或另一台计算机上运行。

消息传递系统的其他优点:

  • 时间解耦:发送方和接收方暂时解耦彼此之间。这意味着发送方和接收方及时独立地执行工作。因此,发送方和接收方之间不存在基于时间的可用性依赖关系。发送方和接收方甚至不需要同时运行。
  • 负载平衡:接收方可以独立于发送方进行扩展,以处理队列中的消息。
  • 负载均衡:发送方无需担心接收方的吞吐量。无论接收者如何使用消息,他们都可以对消息进行排队。
  • 可靠的通信:消息安全地存储在代理中,确保在故障期间不会丢失任何消息。

特殊服务平台提供了一组在支持的消息传递技术中可用的通用功能,如运输,可以根据需要填充任何缺少的本机功能。构建块,如可恢复性,的发件箱、和监测可在所有运输工具上使用。这简化了消息传递技术的选择,使其能够比较消息大小、定价和可移植性等内容。

消息传递与RPC

应用程序可以使用运行远程过程调用(RPC)web服务(WCF或ASMX)、HTTP API(ASP.NET WebAPI)或WebSockets(SignalR)等技术。然而,在使用同步阻塞调用时,可伸缩性和容错性会受到固有的阻碍。使用更多硬件进行扩展通常效果甚微。

使用消息的异步通信支持应用程序之间的松散耦合,并使通信更加可靠,因为不必同时运行两个或多个组件。没有使用异步、单向消息传递的阻塞调用。常见的暂时性错误可以通过重试自动解决,并且很容易从需要手动干预的故障中恢复。最重要的是,即使系统的一部分出现故障,也不会丢失任何数据。

博客:RPC与消息传递——哪个更快?

沟通方式

通过消息传递,通信是单向的异步。虽然可以用另一条消息进行响应,但不可能立即用返回值进行响应。

异步通信不应与异步执行,其中多个线程并行执行代码。中的异步/等待概念。NET是异步执行的一个示例。这与两个组件与消息通信的异步通信不同。

点对点通道

点对点通道启用单向消息传递,其中组件通过消息传递系统向另一个组件发送消息。点对点通道可用于向单个特定消费者发送消息。

信息系统

命令

使用点对点通道发送的消息通常称为命令。发送方需要知道消息的预期目的地,消息描述了发送方希望接收方执行的操作。例如:提交订单,取消订单,或更新库存。点到点消息通信在语义上与异步远程过程调用类似。点对点通道可以组合成各种模式。

阅读更多关于如何在NServiceBus中使用命令. →

请求/回复模式

消息传递是一种方式,但仍可以使用请求/答复模式请求/回复是分布式系统中的一种常见模式,使用两个单向消息,允许一个组件向另一个组件请求信息。这些组件保留了消息传递的优点,例如时间解耦。

从网络的角度来看,请求/响应只是两种单向交互:

请求/响应

这种通信模式对服务器特别重要,使它们能够在与网络连接有问题或存在稳定性问题的客户端通信时保持稳定性。如果客户端在发送请求后,但在服务器发送响应之前崩溃或失去网络连接,服务器将不会在等待连接超时时占用资源。

回调模式

有时,消息发送方必须等待响应才能进行其他操作(也称为“阻塞调用”)。这通常发生在引入消息传递但用户界面设计为等待响应的现有系统中。用户界面没有立即进行部分(但通常是大的)重写回调模式可用于等待响应。

发布/订阅模式

使用发布/订阅模式发送方在逻辑上不知道潜在的接收者。

使用此模式,消息发送方不知道是否存在任何订户或任何订户的详细信息。

发布/订阅

发布消息与发送消息有两种不同的方式:

  1. 可以有多个接收器(订阅者)
  2. 在发送器的设计过程中,接收器未知

最大的好处之一是可以稍后在运行时添加其他接收方,而无需修改发送方。这意味着,除了时间解耦之外,发送方还从逻辑上与任何潜在接收方解耦。消息传递系统负责订阅,并确保将发布的消息传递给订阅方。

事件

发布的消息称为事件。事件描述发生的事情。例如:订单已取消,产品脱销,或装运延迟。有时在处理命令后会发布事件。例如,成功处理取消订单命令可能导致发布订单已取消事件。发布者在处理命令后不必发布事件,但这是常见的情况。

阅读更多关于如何在NServiceBus中使用事件.→

命令查询分离

许多系统为用户提供了搜索、筛选、排序和更改数据的能力。在一些客户端-服务器系统中,服务器只需公开所有创建、读取、更新和删除(CRUD)对客户端的操作。然而,当使用同一个数据库表在处理命令时以高度一致的方式执行CRUD操作,并查询用户要读取的数据时,这些命令和查询会相互冲突。这通常会导致命令和查询的系统性能较差。

通过在系统级甚至客户端和服务器级分离命令和查询,可以避免这个问题。该解决方案利用了这样一个事实,即在许多甚至大多数情况下,返回给用户的数据不必完全是最新的;它可能稍微过时,但不会造成重大问题(也称为“最终一致性”).

使用这种方法,有两个组件分别跨越客户端和服务器。一个组件处理命令,另一个组件响应查询。组件仅使用消息进行通信,并且它们的数据被单独保存,甚至可能保存在单独的数据库、服务器或存储技术中。一个组件无法访问另一个组件的数据:

命令查询分离

命令组件发布消息,查询组件订阅消息。当查询组件收到消息时,它将适当的数据存储在针对查询进行优化的模式中,例如数据库中的星型模式或JSON文档的缓存。它还可以在内存中缓存一些查询响应。

总线与代理架构风格

A类服务总线通常被描绘成一个中央盒子,所有的通信都通过它进行。尽管有共同的理解,但这实际上是对代理架构模式.

A类消息总线总线体系结构模式不是物理实体。可能没有物理公共汽车可以在网络拓扑中指向。这个公共汽车是使用给定应用程序的代码在进程中运行的基础结构的一部分。它类似于与代码一起运行的对等网格。

部署拓扑

其他资源