我不确定这个问题的确切位置(甚至不确定如何提问),所以我希望这里有人能给我指出正确的方向。
我有一个我正在建立的服务。该服务在内存中有不同的对象-每个对象都有自己的状态。无论何时创建一个对象,它都会从数据库加载状态并保存它。当对对象进行更改时,它们也会持久化到数据库中。
我想扩展这项服务。我看过像akka.net (演员模型)这样的解决方案,他们有一个集群解决方案。据我所知,它将状态与所谓的“八卦”同步,即每个节点将状态发送给另一个节点。在这一点上,我不确定是否真的可以将我的工作应用程序转换为akka.net。
我想知道集群如何在不同的节点之间保持状态同步(我理解八卦概念),如果我的机器A接收到一条消息,同时机器B也接收到一条消息-两者都更改了对象的相同状态-这会造成状态之间的数据完整性问题。我唯一的想法是锁定一个共享资源,但这违背了集群的目的。
我似乎在网上找不到任何相关的阅读材料--但我也缺乏我需要关注的技术短语。
如果相关,我使用.NET核心和c#进行开发。
谁能解释一下集群的概念,它是如何工作的,并确保节点处于同步状态?或者可以指出正确的方向?
发布于 2016-11-18 01:41:50
你有大麻烦了。我认为你思考问题的方式是一个更大的问题。让我们来看看一些基础知识。
集群被用来解决大问题,就像“吃掉一头大象”的问题。为了解决这个问题,你可以设计一种独特的、更大的、有着巨大嘴巴的捕食者。但历史和古生物学告诉我们,大型捕食者是不容易维持的(它们对环境的代价很高)。
因此,为了解决你的问题,你可以选择一个更大更强的服务器。
或者,您可以使用集群。
集群以一种截然不同的方式解决了“吃掉大象”的问题。它将使用分布式和共享处理的概念,一次一口地吃掉大象,而不是派出一只有着巨大嘴巴的独特的巨大捕食者来吃掉大象。如果处理得当,蚂蚁可以吃掉大象。如果它们有足够的数量,并且情况是正确的。
但请注意,在我的示例中,蚂蚁非常小……一只蚂蚁永远不会带着整头大象。如果所有的蚂蚁一起工作,您可以承载整个大象,但随后会遇到并发和锁定问题(您必须协调蚂蚁)。
蚂蚁已经向我们展示了一种更好的方法来解决这个问题。他们会从大象身上取一块,分成小块来解决问题。
在您的系统中,您会问如何跨节点同步数据...我的问题是为什么?如果你在同步数据,那么你就是在镜像,你的问题就会变得更大(你在克隆大象,但只能吃原始的)。
你的问题的解决方案是重新考虑解决方案,看看你是否可以把问题分解成更小的部分。
在Akka和Actor模式中,处理问题的最好方法是使用较小的“进程”(单个蚂蚁)。虽然这个过程本身几乎是无用的,但当大规模使用时,它们可以变得非常强大。当架构正确完成时,你会注意到,把火焰喷射器拿到蚂蚁身上不会打败它们……更多的蚂蚁会来,他们会继续解决这个问题。
复制和同步数据不是你的解决方案,而是集群。您必须获取数据并将其分解到可以将其提供给单个ant的点。如果你能做到这一点,那么你就可以使用Akka。如果这种方法看起来很可笑,那么Akka不适合你。
但考虑到这一点。显然,您对数据库后端有顾虑--您不想增加IO并引入单点故障。我不得不同意你的观点。但你需要重新思考一些事情。您可以使用数据库镜像来消除单点故障,但这不会消除瓶颈,这是正确的。因此,假设镜像消除了单点故障...现在让我们来攻克瓶颈部分。
如果你可以将你的数据分成足够小的块,让ants可以处理它,那么我强烈建议你告诉你的ants只在数据发生变化时向数据库报告……你可以在初始化时只读一次(你需要一个后端存储,不要自欺欺人,电力可能很快就会丢失……它必须保存在某个地方),但是如果你告诉你的ants只保存更改过的数据,那么你将从等式中删除所有的查询,这将极大地改变负载的来源。一旦您只需要处理更新、插入和删除操作...整个场景将会简单得多。
集群应该是你的解决方案,但前提是你可以把镜像的概念从你的脑海中移开。
群集节点可能并将崩溃...但它们可以在其他地方重新生成到其他节点,因此您总是拥有一个快速的系统。只有当您处理节点/工作进程/ant崩溃或丢失时,您才必须重新加载数据...
祝你好运。你概述了一个我见过拥有软件工程学位的人不能解决的可怕的问题。
https://stackoverflow.com/questions/40631660
复制相似问题