在这篇博客中,我将描述一家大型银行如何能够在 Apache Ignite In-Memory Data Grid 之上扩展多地域部署。
问题定义
想象一家银行为其客户提供各种服务。银行的客户位于不同的地理区域(区域),并且客户执行的大部分操作都是区域本地的,例如 ATM 取款或账单支付。区域本地操作非常频繁,需要非常快速地处理。
但是,某些操作(例如电汇)可能会影响不同区域的客户。跨区域操作不那么频繁,但仍然需要以事务方式支持。
我们还应该考虑到不同的区域可能需要不同的处理能力。一些人口稠密的地区,例如纽约或芝加哥,银行交易量将比其他人口稀少的地区高得多。
让我们将我们的问题定义为能够彼此独立地存储、部署和扩展不同的地理区域,同时保持同时跨多个区域进行交易、计算和查询的能力。
解决方案
为了快速处理客户交易,我们需要确保在完全不接触磁盘的情况下访问内存中的所有数据。此外,我们需要确保随着区域内负载的增加,我们可以通过向不同地理区域添加更多服务器来水平扩展系统。
让我们总结一下要求:
- 集群中有 N 台机器
- 我们有 Z 个地理区域
- 不同区域的客户数量可能不同
- 每个区域必须能够独立于其他区域进行横向扩展
使用内存数据网格似乎是一个自然的选择。大多数内存数据网格都支持客户数据的分布式事务内存缓存,但是,并非每个数据网格都允许对不同地理区域进行适当的物理分离。
让我们分析几种不同的方法。
方法 1:无区域分离
在这种方法中,来自所有地理区域的所有客户数据在集群内均匀分布,没有任何区域分隔。
坏的:
该解决方案被立即丢弃,因为它不提供任何方式来单独缩放各个区域。
方法 2:每个区域的单独集群
在这种方法中,所有可用的机器都被分成 Z(区域计数)个独立的集群,每个区域部署在一个单独的集群中,具有单独的数据网格。
坏的:
这个解决方案也被放弃了,因为每个区域都有独立的不相交的集群,跨区域操作变得非常难以处理。由于不同的集群彼此不了解,用户将需要手动实现跨区域交易,这是一个非常重要的问题,似乎不值得为此付出努力。
方法 3:具有独立区域的单个集群
事实证明,实际的解决方案是前两种方法的组合。从本质上讲,每个区域都将存储在同一集群内自己的内存缓存中。但是,每个缓存都应该部署在来自同一集群的自己的非交叉服务器组上。
事实证明,Apache Ignite 是唯一允许为同一集群中的不同缓存定义不同服务器拓扑的数据网格。此外,通过使用 Apache Ignite 跨缓存事务支持,跨不同缓存(因此不同区域)的事务也可以开箱即用。
优胜者:
这种方法被选为获胜者,因为它允许以一种非常有效的方式彼此分开配置和扩展不同的地理区域,同时保持执行跨区域交易的能力而无需额外的编码工作。
有关 Apache Ignite 的更多信息或一些非常酷的截屏视频,请访问项目网站。