微服务:数据库和微服务实例
Microservices: database and microservice instances
假设我们有一个微服务 A 和一个 B。B 有自己的数据库。但是 B 必须水平扩展,因此我们最终有 3 个 B 实例。数据库会发生什么变化?它是否相应地扩展,它是否为 3 个 B 实例保持相同的(集中式)数据库,它是否成为一个分布式数据库,会发生什么?
当您使用数据分区时,多个服务实例使用一个数据库是可以的。
答案是根据3个B实例应该共享哪种数据。一些场合:
B是只读数据不写任何东西,DB可以使用replicate方法,三个B实例只是从不同的DB实例读取数据,DB被复制。
B实例可以read/write数据不中断其他B实例,也就是说每个B实例都可以指定数据,实例之间不共享数据,数据库改为三库具有相同的架构但完全不同的数据;
B实例应该共享大部分数据,每个实例都可以偶尔将数据写回DB。所以B实例应该使用一个DB和一些DB锁来避免实例之间的冲突。
在其他一些不同的情况下,会有很多其他的方法来解决这个问题,比如使用像redis这样的内存DB,为B实例使用像rabbitMQ这样的队列服务。
正如 Chris Richardson 在 pattern database per service、
中所解释的
Instances of the same service should share the same database
假设我们有一个微服务 A 和一个 B。B 有自己的数据库。但是 B 必须水平扩展,因此我们最终有 3 个 B 实例。数据库会发生什么变化?它是否相应地扩展,它是否为 3 个 B 实例保持相同的(集中式)数据库,它是否成为一个分布式数据库,会发生什么?
当您使用数据分区时,多个服务实例使用一个数据库是可以的。
答案是根据3个B实例应该共享哪种数据。一些场合:
B是只读数据不写任何东西,DB可以使用replicate方法,三个B实例只是从不同的DB实例读取数据,DB被复制。
B实例可以read/write数据不中断其他B实例,也就是说每个B实例都可以指定数据,实例之间不共享数据,数据库改为三库具有相同的架构但完全不同的数据;
B实例应该共享大部分数据,每个实例都可以偶尔将数据写回DB。所以B实例应该使用一个DB和一些DB锁来避免实例之间的冲突。
在其他一些不同的情况下,会有很多其他的方法来解决这个问题,比如使用像redis这样的内存DB,为B实例使用像rabbitMQ这样的队列服务。
正如 Chris Richardson 在 pattern database per service、
中所解释的Instances of the same service should share the same database