Apache 对高度可扩展和模块化的分布式服务器端体系结构的反思

Apache 对高度可扩展和模块化的分布式服务器端体系结构的反思,apache,architecture,amqp,thrift,twisted.web,Apache,Architecture,Amqp,Thrift,Twisted.web,我的问题并不是一个真正的问题,它更多的是一个征求意见的呼吁——也许这甚至不是发布它的合适地方。尽管如此,这里的社区信息非常灵通,尝试 我在考虑如何创建一个高度可扩展的、最重要的是高度模块化的后端体系结构。例如,一个大型站点的整个后端生态系统有可能演变成一个大型站点 这将需要高度的关注点分离,不仅可以(比如)替换底层数据库(从Oracle到MySQL),还可以替换实际类型的数据库(从SQL到KV,反之亦然) 我设想这样一种情况:每个子系统在后端生态系统中公开自己的API。通过这种方式,API可以保

我的问题并不是一个真正的问题,它更多的是一个征求意见的呼吁——也许这甚至不是发布它的合适地方。尽管如此,这里的社区信息非常灵通,尝试

我在考虑如何创建一个高度可扩展的、最重要的是高度模块化的后端体系结构。例如,一个大型站点的整个后端生态系统有可能演变成一个大型站点

这将需要高度的关注点分离,不仅可以(比如)替换底层数据库(从Oracle到MySQL),还可以替换实际类型的数据库(从SQL到KV,反之亦然)

我设想这样一种情况:每个子系统在后端生态系统中公开自己的API。通过这种方式,API可以保持不变,而随着时间的推移,实现可能会发生变化(甚至是根本性的变化)

系统必须是异构的,因为它不依赖于特定的语言。它必须能够容纳使用不同语言的模块或整个子系统

然后我想到,我所想象的只是网络本身的架构

因此,这里是我的讨论点:除了使用(主要是)基于文本的协议的开销之外,是否有任何压倒一切的原因来解释为什么不应该以我描述的方式实现复杂的后端体系结构,或者使用Twisted、AMQP、Thrift等通信协议是否缺少一些强有力的理由


更新:在@meagar的评论之后,我或许应该重新表述这个问题:使用非常简单、灵活且易于理解的体系结构(即所有功能都以一系列RESTful API的形式公开)是否具有明显的优势足以补偿在后端环境中使用此体系结构时产生的明显性能损失?

[code]可以替换实际类型的数据库(将SQL转换为KV,反之亦然)。[/code]

任何在两个表之间写连接的人都会感到悲伤。如果您想要切换到KV的“能力”,那么您不应该公开一个比KV支持的API更丰富的API

你的问题的答案取决于你想要完成什么。您希望将每个模块保持在合理的控制范围内。使用适当的代码物理分层,使用带有副作用契约的定义接口,为每个接口的每个成功和失败案例使用测试用例。这样,您就可以依赖“当用户进入blah页面时,会生成一个用户blah事实,以便调用所有已注册的事实侦听器。”这样,您就可以扩展系统,而无需从点a直接调用到点B,同时仍然可以对广泛不同的依赖项进行某种控制。(我讨厌代码库,在代码库中,您无法找到所有符号的所有可能引用!)


然而,我们将大量代码和类放入单个系统的事实是因为系统之间的调用通常非常非常昂贵。您需要从代码模块的角度来考虑,在您可以的地方,代码模块会相互发出请求。函数调用和REST调用之间的时间差大约是1到100万(如果只计算周期,而不是挂钟时间,可能会低至1到10000,但我不太确定)。此外,数据中心中的任何连接都可能遭受数据包丢失,因为无论您如何努力,都不存在100%无丢失的数据中心。数据包丢失意味着应用程序的响应时间会出现随机延迟峰值。

听起来像是巨大的延迟。你为什么需要这个?这个过于复杂的系统解决了什么问题?它提供了什么,你不能从传统的灯堆中走出来?谢谢你的评论@meager。如果说有什么区别的话,我会说这与内部平台效应完全相反。换句话说,也可以使用现有的web体系结构来管理后端。也就是说,我已经更新了我的问题,以考虑您的评论。