我们目前正在开始将活动从一个中央应用程序广播到其他可能感兴趣的消费者应用程序,我们团队成员之间有不同的选择我们应该在发布的消息中加入多少。< / p>
总体思路/架构如下:
基于Enterprise Integration Patterns我们正在尝试为发布的消息定义 Canonical格式,并且在两种方法之间犹豫不决:
极简主义消息 / event-store-ish :对于域模型发布的每个事件,生成仅包含聚合根部分的消息相关的(例如,更新完成时,只发布有关聚合根的更新部分的信息,或多或少与最终用户在使用我们的应用程序时经历的过程相匹配)
赞成
缺点
完全包含的幂等消息:对于域模型发布的每个事件,生成一条消息,其中包含该时间点的聚合根的完整快照,因此处理实际上只有2种消息&#34;创建或更新&#34;和&#34;删除&#34; (如有必要,可提供更具体信息的元数据)
赞成
缺点
你会推荐一种方法吗?
我们应该考虑另一种方法吗?
答案 0 :(得分:4)
我们应该考虑另一种方法吗?
您可能还会考虑不将该信息从服务中泄露出来作为该部分业务的technical authority
这大致意味着您的事件带有标识符,以便感兴趣的各方可以知道感兴趣的实体已经更改,并且可以向权威机构查询该州的更新。
对于域模型发布的每个事件,生成一条消息,其中包含该时间点聚合根的完整快照
这也有额外的 Con ,对聚合表示的任何更改也意味着对消息模式的更改,这是API的一部分。因此,对聚合的内部更改开始跨越您的服务边界。如果您正在实施的汇总对您的业务具有竞争优势,那么您可能希望能够快速适应;涟漪会增加摩擦力,从而降低你的变化能力。
如果消费者状态和生产者状态不同步怎么办?
我可以说,这个问题表明设计错误。如果消费者需要状态,也就是说从聚合历史构建的视图,那么它应该从生产者那里获取该视图,而不是试图从观察到的消息集合中组装它。
也就是说,如果您需要州,则需要历史(完整,有序)。所有单个事件都会告诉您历史记录已经改变,您可以逐出历史记录。
同样,对变化的响应:如果你改变了生产者的实现,消费者也试图拼凑他们自己的历史副本,那么你的变化就会在服务范围内波动。