Domain driven design 没有共享事件库的微服务之间基于事件的通信?

Domain driven design 没有共享事件库的微服务之间基于事件的通信?,domain-driven-design,microservices,cqrs,event-sourcing,Domain Driven Design,Microservices,Cqrs,Event Sourcing,我正在学习微服务 一方面,文献建议对需要在sagas上协作或对其他服务发布的事件采取行动的微服务使用异步事件发布 另一方面,同一文献建议不要使用共享库来定义公共事件,因为这样可以通过该事件库耦合微服务 我在吃疯狂的药片吗?如果这些微服务依赖于这些事件,它们不也是由这些事件耦合的吗?如果是这样,在两个或更多不同的地方用相同的定义编码完全相同的事件有什么好处?这不是完全违反了干燥原则吗 我开始闻到一种代码的味道,以首字母B开头。有人能帮我喝下剩下的酒吗?还是我只是看到皇帝脱下衣服 如果是这样,在两个

我正在学习微服务

一方面,文献建议对需要在sagas上协作或对其他服务发布的事件采取行动的微服务使用异步事件发布

另一方面,同一文献建议不要使用共享库来定义公共事件,因为这样可以通过该事件库耦合微服务

我在吃疯狂的药片吗?如果这些微服务依赖于这些事件,它们不也是由这些事件耦合的吗?如果是这样,在两个或更多不同的地方用相同的定义编码完全相同的事件有什么好处?这不是完全违反了干燥原则吗

我开始闻到一种代码的味道,以首字母B开头。有人能帮我喝下剩下的酒吗?还是我只是看到皇帝脱下衣服

如果是这样,在两个或更多不同的地方用相同的定义编码完全相同的事件有什么好处

这可能有很多好处——微服务可以使用不同的语言实现。或者使用相同的语言,但内存中的数据表示形式不同,以满足特定的需要。甚至是相同的内存表示形式,但版本不同,因为它们处于不同的部署计划中

在服务的实现之间共享准备消息传递库的工作本身并没有什么错。但这应该是一种选择,而不是一种要求。特别是,如果共享实现遇到阻碍,团队始终可以选择替换库

两个同意消息将使用UTF-8编码的JSON文档的服务不需要使用相同的解析器——解析器的选择是一个实现细节。耦合到模式是关于消息中字节语义的协议,而不是实现

如果是这样,在两个或更多不同的地方用相同的定义编码完全相同的事件有什么好处

这可能有很多好处——微服务可以使用不同的语言实现。或者使用相同的语言,但内存中的数据表示形式不同,以满足特定的需要。甚至是相同的内存表示形式,但版本不同,因为它们处于不同的部署计划中

在服务的实现之间共享准备消息传递库的工作本身并没有什么错。但这应该是一种选择,而不是一种要求。特别是,如果共享实现遇到阻碍,团队始终可以选择替换库


两个同意消息将使用UTF-8编码的JSON文档的服务不需要使用相同的解析器——解析器的选择是一个实现细节。耦合是对模式的,是对消息中字节语义的约定,而不是对实现的约定。

如果将事件视为普通数据对象,则不需要库来处理它们,而只需要通用消息处理和序列化/反序列化代码

微服务的全部意义在于拥有独立的开发周期,因此,一旦引入公共库,您就开始制作分布式单体。此库中的任何更改都将导致重新部署所有微服务


如果没有特定于事件的库,唯一的依赖关系就是从另一个微服务向它介绍特定事件结构的知识。嗯,这是一个必要的邪恶

如果您将事件视为普通数据对象,则不需要库来处理它们—除了通用消息处理和序列化/反序列化代码之外

微服务的全部意义在于拥有独立的开发周期,因此,一旦引入公共库,您就开始制作分布式单体。此库中的任何更改都将导致重新部署所有微服务


如果没有特定于事件的库,唯一的依赖关系就是从另一个微服务向它介绍特定事件结构的知识。嗯,这是一个必要的邪恶

使用同一个事件库不仅是为了节省人力,而且是为了提高正确性和消除错误,您提到的其中一个问题是:尝试通信的不同微服务之间的协议版本不匹配。当然,如果它是一个由.NET服务和Java服务组成的异构系统,那么单个库不能为这两个服务定义事件结构。但是.NET服务可以共享一个,Java服务也可以共享一个,这会更好,即使库只是接口,将实现推迟到消费者。医生们贬低了这一点。我叫BS,它是n
ice希望听到有人保持真实并说“是”,事件对象被序列化为JSON。我想知道有多少项目在这种思想的重压下被压垮了。我感谢你抽出时间回答这个问题。我同意,在您的服务实现中分担准备消息传递库的工作本身并没有什么错。我不同意这样做的最佳理由只是为了省力。使用相同的事件库不仅是为了省力,而且是为了提高正确性和消除错误,您提到的其中一个原因是:尝试通信的不同微服务之间的协议版本不匹配。当然,如果它是一个由.NET服务和Java服务组成的异构系统,那么单个库不能为这两个服务定义事件结构。但是.NET服务可以共享一个,Java服务也可以共享一个,这会更好,即使库只是接口,将实现推迟到消费者。医生们贬低了这一点。我称之为BS,很高兴听到有人保持真实并说是的,事件对象被序列化为JSON。我想知道有多少项目在这种思想的重压下被压垮了。我感谢你抽出时间回答这个问题。我同意,在您的服务实现中分担准备消息传递库的工作本身并没有什么错。我只是不同意这样做的最好理由只是为了节省劳动力。谢谢你。我的反驳是:是的,必须从其他微服务和活动内容中了解特定事件。有鉴于此,我们可以通过将知识提交到代码中来将其形式化,或者将其保持为轶事;据我所知,语音和文档的丢失总是很容易出错的。我的另一点是,为什么不一次重新部署所有的微服务呢?CI使这变得容易。是的,关于微服务是孤立存在的说法是有帮助的,但也可能是繁重的。专家们知道什么时候应该改变规则。谢谢。我的反驳是:是的,必须从其他微服务和活动内容中了解特定事件。有鉴于此,我们可以通过将知识提交到代码中来将其形式化,或者将其保持为轶事;据我所知,语音和文档的丢失总是很容易出错的。我的另一点是,为什么不一次重新部署所有的微服务呢?CI使这变得容易。是的,关于微服务是孤立存在的说法是有帮助的,但也可能是繁重的。专家们知道什么时候应该改变规则。