我希望将微服务架构模式用于新系统,但是当服务彼此隔离时,我很难弄清楚如何在服务之间共享和合并数据。特别是,我正在考虑返回合并数据以通过HTTP填充Web应用程序UI。
对于上下文,我打算将每个服务部署到自己的孤立环境(Heroku),在那里我无法在服务之间进行内部通信(例如通过//localhost:PORT
。我计划使用RabbitMQ进行服务间通信,使用Postgres进行数据库通信。
服务的分离对CREATE操作有意义:
UserId
的认证用户提交'加入群组'前端的网络表格GroupJoinRequest
的新UserId
已添加到RabbitMQ队列Groups
服务会选择事件并对其进行处理,引用用户的UserId
但是,如果我想跨表/模式合并数据,则READ操作要困难得多。让我们说我想获取某个组中所有用户的详细信息。在单片设计中,我只是跨用户和组表执行SQL JOIN
,但这会失去微服务的隔离优势。
我的选择似乎如下:
要查看Users
中的所有Group
,网站访问者会从“群组”服务获取与群组关联的UserID
列表,然后查询Users
得到他们的名字。
优点:
缺点:
公共API服务器处理请求端点。 API服务器中的应用程序逻辑通过HTTP通道向每个服务发出请求,该通道只能由系统中的其他服务访问。
优点:
缺点:
鉴于我已经运行了RabbitMQ,我可以使用它来排队数据请求,然后自己发送数据。例如:
GetUsersInGroup
RequestID
个事件
Groups
服务选择此功能,并将UserID
添加到队列RequestID
的事件,等待响应,将数据合并为正确的格式,然后发送回客户端优点:
缺点:
VIEW
s 服务被隔离到数据库模式中。模式只能由各自的服务写入。服务在其模式上公开可由其他服务查询的SQL VIEW
层。
VIEW
用作API合约;即使底层架构或服务应用程序逻辑发生更改,VIEW
也会公开相同的数据,因此
优点:
缺点:
我倾向于最后一个选项,但会对其他方法的任何想法表示感谢。
答案 0 :(得分:1)
为了评估优缺点,我认为您应该关注微服务架构旨在实现的目标。在我看来,微服务是一种建筑风格,旨在构建松散耦合的应用程序。它不是为构建高性能应用程序而设计的,因此当我们决定以微服务方式构建应用程序时,我们已经准备好接受性能和数据冗余的划痕。
我不认为您的服务应该共享数据库。更紧密的耦合掩盖了微服务架构的主要目标。我的建议是创建一个统一数据服务,从所有其他服务中获取数据更改事件并更新其后面的数据库。您可能希望以针对查询优化的方式(如数据仓库)设计统一数据服务后面的数据库,因为将使用所有这些服务。您可能需要考虑使用NoSQL数据库来支持整合数据服务。