我正试图把我的注意力集中在事件源架构上。
似乎常见的建议是让小事件中包含尽可能少的信息(而不是包含所有内容的大型事件,以允许其他服务存储自己的数据)。
显然,减少服务之间的耦合是被鼓励的。因此,人们通常建议不要从一个服务直接调用另一个服务,对另一个服务进行REST/qRPC/等调用将是一件坏事。人们似乎将事件描述为服务之间应该发生的唯一沟通。
然而,在我看来,小事件和服务之间没有直接的交流是不可能的。例如,订单服务可能需要知道存储在产品服务中的产品的名称。
事件源架构中的微服务是否应该通过REST/gRPC/等等直接相互通信?
发布于 2019-11-20 22:05:53
在使用微服务时,最关心的是处理请求所需的时间。这意味着您必须管理同步响应时间。重要的是要认识到设计决策的影响。当用户从网站发出请求时,有效响应需要一段时间。
异步调用允许您尽快向调用方提供响应,同时允许所有其他服务迎头赶上。这一概念被称为最终一致性。通常,您正在使用消息队列或类似的服务(如Kafka)通知其他服务数据已经更改。
没有理由一个微服务不能调用另一个微服务。浏览器可以这样做,您的服务也可以这样做。你只需要知道什么是交换:
您可能需要明智地在解决方案中同时使用异步调用和同步调用。没关系。异步通知其他服务的主要优点是,在向用户发送响应之前,不必等待所有内容同时更新。另一个优点是,当数据更改或被访问时,您可以提供复杂的算法,而无需等待计算完成。
让用户等待的时间越短,web应用程序的响应性就越强。使用最合适的方法来处理请求。
发布于 2019-11-20 21:37:06
我正试图把我的注意力集中在事件源架构上。
请注意,您在这里描述的是一个事件驱动的体系结构。事件来源确实意味着一些不同的东西。
如果我们讨论的是一个微服务体系结构,那么我们希望能够一次重新部署一个微服务。即使在重新部署邻居时,自治的微型服务也需要能够取得进展。这就产生了一个问题--如果我的服务正在等待您的服务的答复,并且您的服务正在重新部署,它就无法取得进展。
通常的答案是使用数据副本--我的服务可以取得进展,因为它缓存了它从您那里需要的信息的副本。换句话说,如果我们同意异步交换消息,而不是同步交换消息,那么当一个微服务不可用时,就不会出现级联中断。
事件是“公正”的消息;您需要有某种方式在系统中的微服务之间交换消息。根据您所面临的情况选择合适的传输方式。例如,Atom Syndication / Atom Pub为您提供了一个很好的标准,可以将消息添加到许多组织都非常了解的集合中;但是,当您处理的是同一家公司拥有的、彼此接近的一组封闭的微服务时,您可能不希望这些类型的权衡。另一种选择是使用消息总线。或者让您的微服务共享一个公共消息存储。
然而,在我看来,小事件和服务之间没有直接的交流是不可能的。例如,订单服务可能需要知道存储在产品服务中的产品的名称。
在某种程度上,它来自于职责的分离--为什么订单服务需要的不仅仅是一个不透明的产品标识?这是否表明在其他地方存在设计缺陷?
过去的许多数据设计在空间上都受到了严格的限制;为了节省空间,我们希望每个事实都有一个副本。我们今天所做的交易是不同的,由于存储成本低廉,拥有一个数据副本就不那么重要了(我们仍然需要考虑哪些数据是副本,哪些数据具有权威性)。
所以是的,如果订单服务必须有产品名称,那么一定有一条消息会带来这些信息。因此,这个信息需要一些交通工具才能到达它需要去的地方。
另见Pat Helland:外面的数据...
https://softwareengineering.stackexchange.com/questions/401365
复制相似问题