2016-09-13 28 views
2

我想创建一个分布式系统,其中数据在所有节点上分割。我知道有像Hazelcast或Apache Ignite这样的图书馆可以为你做这项工作。就我而言,对于每个分片密钥,我需要创建一个到另一个系统的套接字订阅,这样不仅仅是分发数据,还包括如何以分布式方式实际创建这些订阅。如何根据字符串的值在一组节点上进行分片?

想法是,为每个分片键创建一个订阅到其他系统。每个订阅都会保留一个包含数据的条目列表,以检查来自套接字连接的每个更新。

我想到的是,为每个新条目发送一条带有分片键和数据的消息给主题。然后,每个节点将应用分片算法来决定哪些负责处理消息,然后创建对套接字连接的订阅(如果它尚未存在并向其中添加数据)。

这样做的复杂性在于处理群集拓扑变化。我需要手动重新平衡这些连接,方法是让一个节点充当领导者,重新装入数据库中的数据并重新发送数据。节点还需要对清除订阅的这些更改做出反应。为此,我考虑使用一个版本号,该版本号会随着每次更改而增加的数据一起出现,并允许节点识别这些更改。另一个解决方案是让每个节点都知道通过事件发生的拓扑变化,但这些都是异步的,所以在清除订阅时我可能会遇到竞争状况。

有没有其他方式或更好的做法?也许Ignite提供了一些功能? (我在这种情况下使用Ignite作为缓存)

谢谢。

回答

0

这听起来像是一个用于连续查询的用例:https://apacheignite.readme.io/docs/continuous-queries

+0

请您详细说明一下吗?对于我通过阅读文档所了解的内容,我需要创建:1-使用分片算法加载当前数据的查询。 2-对于新条目具有相同分片算法的过滤器。 3-一旦一切都已经开始,通过过滤器的条目的监听者。 4-代码来处理通过初始查询的条目。有了这个,我会确保每个条目只有一个节点执行我的逻辑。它是否正确?我将如何处理拓扑变化?我需要重新开始集群中的每个更改。 – Kilian

+0

首先,Ignite不会做分片。它基于亲和函数基于每个密钥级别分割数据。连续查询允许节点侦听群集中任何位置发生的缓存更新,并在服务器端使用可选的筛选器(您可以放置​​任何您喜欢的逻辑)。如果您有备份,拓扑更改会自动处理。 –

相关问题