【问题标题】:Data distribution for a system with SOA具有 SOA 的系统的数据分发
【发布时间】:2013-12-20 23:16:43
【问题描述】:
我有一个 rails 应用程序,它管理不同类型的项目和拥有它们的用户。不同类型的项目可能有不同的特性。有许多 sinatra 服务必须访问项目(只读,每个服务都有一个特定的项目类型)。
为每个服务创建单独的表/数据库并使其与 rails DB 保持同步是个好主意吗?在这种情况下,主数据库将保存所有项目。它是 postgres,因此 hstore 可以用于不同的功能。在所有更新中,将使用 Redis pub/sub 或 RabbitMQ 消息发送同步消息。服务将订阅和更新服务特定的表。
系统应该非常可靠、可扩展,并为高负载和新的未知项目类别做好准备。你怎么看?这是否有意义或有更好的方法来满足这些要求?提前感谢您,非常感谢您的帮助!
【问题讨论】:
标签:
ruby-on-rails
ruby
postgresql
sinatra
soa
【解决方案1】:
这里没有万能的答案。答案取决于您的要求,这些将决定您可以采用两种方法中的哪一种。
第一种方法在概念上是最简单的,即让每个服务访问同一个数据库。这里的优点是您可以相对轻松地扩展,系统简单灵活,并且您可以使用数据库做很多事情来保持工作正常。缺点是db downtime会一次性关闭所有服务。
第二种方法是将每个服务(或密切相关的服务组)保持为独立的自包含服务,与某种消息传递保持同步。这样做的优点是在提供基本服务方面更加健壮,但在所有保持同步方面的健壮性要低得多(因为 CAP 定理的一致性要求牺牲了可用性,并且您的数据被有效分区)。
我不知道你会想要使用哪一个。在可能的范围内,我通常会选择单数据库方法,但我是 Postgres 人,而不是 Rails 人。第二种方法在某些情况下也很有效,但它确实有一定的复杂性。