我们正在将单片应用程序迁移到微服务架构。由于某些法规要求,我们必须将来自不同国家/地区的客户数据保存在单独的(特定于国家/地区)数据库中。即美国客户的美国数据库,英国客户的英国数据库...
我们正在考虑的以下设计如下:
选项1:具有休眠多租户支持的多租户应用程序,可以根据需求扩展到N次(例如kubernetes pod)。该应用程序的单个实例将能够连接到所有数据库。
选项2:每个国家/地区数据库部署1个微服务实例。通过它们前面的API网关路由流量
如果要设计这种类型的系统,您会选择什么?
我们正在将单片应用程序迁移到微服务架构。由于某些法规要求,我们必须将来自不同国家/地区的客户数据保存在单独的(特定于国家/地区)数据库中。即美国客户的美国数据库,英国客户的英国数据库...
我们正在考虑的以下设计如下:
选项1:具有休眠多租户支持的多租户应用程序,可以根据需求扩展到N次(例如kubernetes pod)。该应用程序的单个实例将能够连接到所有数据库。
选项2:每个国家/地区数据库部署1个微服务实例。通过它们前面的API网关路由流量
如果要设计这种类型的系统,您会选择什么?
Answers:
我认为选项2不错,但可能不需要。微服务用于让您处理多个应用程序的需求。
这里的一个重要因素是两种模式之间是否存在任何差异,以及将来是否存在任何差异。
通常,我认为对存储库使用接口是不必要的。但是,在这种情况下可能值得付出努力。储存库工厂对您很重要。
我对选项1的问题是它太具体了。您应该能够从所描述的设置转到两个单独的实例,每个实例都指向自己的数据库。该应用程序不应该在意从中获取数据的位置。
尽管两个不同的数据库的架构没有不同,但是您可以让一个存储库轻松处理这两个数据库,而应用程序不知道它们之间的区别:
public class MyEntityRepository : ISavesMyEntity, IGetsMyEntity
{
public MyEntityRepository(string connectionString)
{
_connectionString = connectionString;
}
}
public class MyEntitySaverFactory
{
public ISavesMyEntity GetSaver(User user)
{
if (user.IsUK)
return new MyEntityRepository(Config.Get("UKConnString"));
if (user.IsUS)
return new MyEntityRepository(Config.Get("USConnString"));
throw new NotImplementedException();
}
}
//USE
ISavesMyEntity saver = factory.GetSaver(currentUser);
saver.Save(myEntityInstance);
如果数据库模式在美国和英国之间变得截然不同,那么您将把功能分成两个完全不同的存储库。这将很容易,因为您要做的就是更换工厂。
我会选择第二种选择,它减少了开发和部署中的摩擦。
因为您将应用程序分布到每个区域1个(或至少一个)实例,而不是整个世界中的至少一个实例,所以这将提供更好的可伸缩性和可用性以及更好的零停机时间部署选项。
随着需求的变化,您可能会具有更多特定于区域的业务逻辑以及数据可能也会发生变化,我将尝试按区域划分代码及其数据,并避免共享特定于区域的业务逻辑(您可能最终会共享一些核心代码)。
说得通?