我将用 Twitter 说明我的问题。例如,Twitter 具有基于微服务的架构,这意味着不同的进程位于不同的服务器中并拥有不同的数据库。
出现一条新推文,服务器 A 在其自己的数据库中存储一些数据,生成新事件并触发它们。服务器 B 和 C 此时没有收到这些事件,也没有在他们的数据库中存储任何内容,也没有处理任何内容。
创建推文的用户想要编辑该推文。为了实现这一点,所有三个服务 A、B、C 应该已经处理了所有事件并将所有需要的数据存储到 db,但是服务 B 和 C 还不一致。这意味着我们目前无法提供编辑功能。
正如我所看到的,一种可能的解决方法是切换到立即一致性,但这会带走所有基于微服务的架构优势,并且可能会导致紧耦合问题。
另一种解决方法是在一段时间内限制用户的操作,直到所有必要服务的数据不一致。可能是一个解决方案,取决于客户及其业务需求。
另一种解决方法是添加额外的逻辑或可能的服务 D,它将编辑存储为用户的操作,并仅在它们一致时将其应用于数据。缺点是大大增加了系统的复杂性。
并且有两阶段提交,但那是 1) 不是很可靠 2) 慢。
我认为在 Twitter 的负载情况下,缓慢是一个巨大的缺点。但也许它可以被解决,而缺乏可靠性则不能,同样,如果不增加解决方案的复杂性。
所以,问题是:
- 对于图示的情况是否有任何好的解决方案,或者只有我提到的解决方法?也许一些编程平台或数据库?
- 我是否误解了某些东西并且某些解决方法不正确?
- 除了最终一致性之外,是否还有其他方法可以保证所有数据都将被存储并且所有必要的操作都将由其他服务执行?
为什么为这个用例选择了最终一致性?正如我所看到的,如果我们谈论的是事件驱动的方法,当某些服务将在某些事件被触发时开始工作时,它是保证某些数据将被存储或某些操作将被执行的唯一方法,并且按照我的示例,该事件将是“已创建推文”。因此,如果服务 B 和 C 出现故障,我需要在它们再次启动时能够成功执行操作。
我想要达到的目标是:可靠性、承受高负载的能力、足够复杂的解决方案。任何相关主题的任何链接将不胜感激。
如果这种方法有自然的局限性,而我想要的不能使用这种范式实现,那也没关系。我只需要知道这个问题真的还没有解决。