0

我不确定这个问题的确切位置(或什至如何问),所以我希望这里有人能指出我正确的方向。

我有一个正在构建的服务。该服务在内存中有不同的对象——每个对象都有自己的状态。每当创建一个对象时,它都会从数据库中加载状态并保存它。当对对象进行更改时,它们也将持久保存在数据库中。

我想扩展这项服务。我查看了诸如 akka.net(演员模型)之类的解决方案,他们有一个集群解决方案。根据我的阅读,它将状态与他们称为“八卦”的东西同步,其中每个节点将状态发送到另一个节点。我不确定此时是否真的可以将我的工作应用程序转换为 akka.net。

我想知道集群如何在不同节点之间保持状态同步(我得到了八卦概念),如果我的机器 A 接收到一条消息,同时机器 B 也接收到一条消息,会发生什么 - 两者都改变​​了相同的状态对象的 - 这将使状态之间的数据完整性出现问题。我对此的唯一想法是锁定共享资源,但这违背了集群的目的。

在数据库中保持状态也不是一种选择,因为数据库成为瓶颈和单点故障。

我似乎无法在网上找到任何相关的阅读材料——但我也缺乏我需要关注的技术短语。

如果它是相关的,我正在使用 .NET Core 和 c# 进行开发。

谁能解释集群的概念,它是如何工作的并确保节点同步?还是可以指出正确的方向?

4

1 回答 1

2

你有一个大问题。我认为你思考问题的方式是一个更大的问题。让我们来看看一些基础知识。

聚类用于解决大问题,很像“吃大象”的问题。你可以设计一个独特的、大嘴巴的捕食者来解决这个问题。但是历史和古生物学向我们表明,大型捕食者不容易维持(它们对环境的代价很高)。

因此,要解决您的问题,您可以使用更大更强大的服务器。

或者,您可以使用集群。

聚类以一种非常不同的方式解决了“吃大象”的问题。它不会派出一只独特的巨大的捕食者来吃掉大象,而是使用分布式和共享处理的概念,一次吃一口。如果处理得当,蚂蚁可以吃掉大象。如果它们足够多并且情况正确。

但请注意,在我的示例中,蚂蚁非常小……一只蚂蚁永远无法承载整只大象。如果所有蚂蚁一起工作,你可以扛起整头大象,但是你会遇到并发和锁定问题(你必须协调蚂蚁)。

蚂蚁向我们展示了一种更好的方法来处理这个问题。他们会从大象身上分一杯羹,分小块处理问题。

在您的系统中,您问如何跨节点同步数据......我的问题是为什么?如果您正在同步数据,那么您正在镜像并且您的问题变得更大(您正在克隆大象,但只能吃原始数据)。

解决问题的方法是重新考虑解决方案,看看是否可以将问题分解成更小的部分。

在 Akka 和 Actor 模式中,处理问题的最佳方法是使用更小的“进程”(单个 ant)。虽然这个过程本身几乎没有用,但当大规模使用时,它们会变得非常强大。当架构正确完成时,您会注意到对蚂蚁使用火焰喷射器不会打败它们......更多的蚂蚁会来,它们会继续解决这个问题。

复制和同步数据不是您的解决方案,集群才是。您必须获取数据并将其分解到可以将其提供给单个蚂蚁的程度。如果你能做到这一点,那么你可以使用 Akka。如果这种方法看起来很可笑,那么 Akka 不适合你。

但是考虑一下……您显然对数据库后端有顾虑——您不想增加 IO 并引入单点故障。我不得不同意你的看法。但是你需要重新考虑事情。您可以使用数据库镜像来消除单点故障,但您是正确的,这不会消除瓶颈。所以假设镜像消除了单点故障......现在让我们攻击瓶颈部分。

如果您可以将数据拆分成蚂蚁可以处理的足够小的块,那么我会敦促您告诉蚂蚁仅在数据更改时向数据库报告...您可以在初始化时读取一次(您需要一个后端存储,不要自欺欺人,电力很快就会丢失......它必须保存在某个地方)但是如果你告诉你的蚂蚁只保留更改的数据,那么你将从等式中删除所有查询,这将大大改变负载的位置来自。一旦你只需要处理更新、插入和删除……整个环境就会简单得多。

集群应该是您的解决方案,但前提是您可以将镜像的概念从脑海中移开。

集群节点可以并且将会崩溃......但是它们可以在其他节点的其他地方重生,这样您就可以始终拥有一个快速的系统。只有当您处理节点/工作进程/蚂蚁的崩溃或丢失时,您才需要重新加载数据......

祝你好运……你概述了一个我见过拥有软件工程学位的人无法解决的棘手问题。

于 2016-11-17T17:41:50.457 回答