对分布式事务使用事件溯源是个好主意吗?
Is it good idea to use event sourcing for distributed transactions?
我有 2 个有状态服务集群:mongo 和 elasticsearch 集群。我想让两个集群的文档保持同步。
对我来说这看起来像是一个分布式事务问题,我决定尝试事件溯源,因为它不仅解决了这个问题,而且很适合我的应用程序。
我决定使用 https://eventstore.org 来存储事件,并从我的后端订阅更改,然后更新我的有状态集群。
我的后端是无状态的,最终它会扩展到多个实例,我担心每个后端实例都会从 eventstore 获取更新并更新有状态集群,因为更新可能是幂等的,所以我每次写都会得到N个相似的文档。这个问题一般是怎么解决的?
我真的不想为每个集群创建一个单例订阅者,它监听更新,它使这个单例成为单点故障...
How is usually this problem solved?
使用单例编写器是一个很好的解决方案。通过这种方式,您可以确保不会重复工作,并且可以按照事件写入事件存储的顺序使用事件更新有状态集群。
I really don't want to create a singleton subscriber for each cluster, which listens for updates, it makes this singleton a single point of failure...
这可以轻松缓解,因为这个单例服务是无状态的,所以它可以很容易地重新启动,甚至可以在失败时转移到另一台主机上。如果您使用容器编排器(如 Docker Swarm 或 Kubernetes),这很容易。
我有 2 个有状态服务集群:mongo 和 elasticsearch 集群。我想让两个集群的文档保持同步。
对我来说这看起来像是一个分布式事务问题,我决定尝试事件溯源,因为它不仅解决了这个问题,而且很适合我的应用程序。
我决定使用 https://eventstore.org 来存储事件,并从我的后端订阅更改,然后更新我的有状态集群。
我的后端是无状态的,最终它会扩展到多个实例,我担心每个后端实例都会从 eventstore 获取更新并更新有状态集群,因为更新可能是幂等的,所以我每次写都会得到N个相似的文档。这个问题一般是怎么解决的?
我真的不想为每个集群创建一个单例订阅者,它监听更新,它使这个单例成为单点故障...
How is usually this problem solved?
使用单例编写器是一个很好的解决方案。通过这种方式,您可以确保不会重复工作,并且可以按照事件写入事件存储的顺序使用事件更新有状态集群。
I really don't want to create a singleton subscriber for each cluster, which listens for updates, it makes this singleton a single point of failure...
这可以轻松缓解,因为这个单例服务是无状态的,所以它可以很容易地重新启动,甚至可以在失败时转移到另一台主机上。如果您使用容器编排器(如 Docker Swarm 或 Kubernetes),这很容易。