【发布时间】:2019-08-04 00:12:21
【问题描述】:
我们有一个数据处理管道,我们可以在其中接收来自不同来源的数据。整个管道是通过使用事件驱动架构和微服务来实现的。其中一项服务具有三个独立的任务。其中两个在不同的数据源中是完全通用的,但是第三个任务范围可能会根据我们的数据源而略有变化。例如,对于一个源,唯一签名可以根据filed1 和filed2 计算,而对于另一个源,它可以根据field2 和field3 计算。实现此服务以符合微服务粒度原则的最佳方式是什么?
我想到了三种方法:
1) 创建一个服务并为每个源使用不同的实现(如工厂设计模式)。根据来源,将在运行时使用其中一种实现。
优点:服务数量较少。更简单的复杂性
缺点:由于该服务将在所有数据源之间共享,因此通过添加任何新数据源应重新部署该服务,这会在该服务与负责从某个源收集数据的任何服务之间创建隐式依赖关系
2) 将此服务拆分为两个服务,对所有源使用一个,并为每个数据源重新实现提取的服务。
优点:收集器和这两个服务之间没有依赖关系。通过添加新源,需要实施新服务,并且不需要重新部署与其他源相关的服务。
缺点:服务更多,而且由于服务太小,我们将来可能最终会面临纳米服务问题。
3) 不要改变服务的粒度,而是在运行时创建不同的服务实例。每个都有不同的配置来指定要用于每个源的字段集。在这种情况下,代码是共享的,但运行时实例会根据其所属的源而有所不同。
优点:服务数量较少,并且没有操作依赖性
缺点:将逻辑的复杂性转移到运行时,这可能会使部署和操作更具挑战性
【问题讨论】:
-
您是否考虑过可扩展性、每项服务的关键性、新服务的更改频率等?通常,这些 NFR 有助于定义您是需要创建服务还是重用现有服务(配置/功能标志)
-
@AminAbu-Taleb 是的。从技术上讲,更改频率是这里的主要区别点,因为通过添加新源,我们需要修改受解决方案 1 影响的服务。
-
是否有可能构建动态规则处理程序?我在建立优惠券系统时遇到了类似的问题。顺便说一句,我认为第二个在企业架构中是不合理的。
-
@wl.GIG 动态规则处理程序是什么意思?
-
@Alin 就像所有数据源的通用处理程序,输入参数如 [columns: {as, bb,...}, crypto: xxxxx ]
标签: architecture microservices event-driven