当前位置: 首页 > 知识库问答 >
问题:

两个微服务,用于读取和写入一个数据库表

徐承载
2023-03-14

我对微服务最佳实践方法有点困惑。

以下场景:

来自mqtt设备的大量传入消息。一个rest api,客户可以在其中读取消息(大部分只是其中的一部分)。

我的想法是,创建一个用于将消息存储在数据库表中的微服务。还有第二个带有rest api的微服务来读取这些消息。我想这样做,因为缩放问题。(传入的存储部分比读取rest api需要更多的电力)

我读到“完美”的微服务应该是唯一一个在数据库中访问其数据的微服务。因此,其他微服务应该通过其 API 而不是数据库级别请求此数据。所以我的方法不会是完美的。我看到一些选项来处理这个问题:

  • 只有一个微服务,用于存储和读取
  • 在存储微服务中创建api,其余微服务可以在其中获取数据

但所有这些,对我来说都不好看。

你有什么意见?

问候你,马库斯

共有2个答案

蒋航
2023-03-14

现实地说,除非你正在做一些计算密集型的阅读或写作,否则你的数据库IO很可能是你的争论点。我强烈认为把你的系统构建得“完美”,然后运行容量测试,看看瓶颈在哪里。不要忘记唐纳德·克努特的话:“过早优化是万恶之源”。

如果您决定您的服务需要扩展,请查看您是否可以水平扩展读取和写入(创建组合服务的更多实例)。

如果这不能获得您需要的性能,那么就像另一个回答者所建议的那样,看看更复杂的扩展需求。

颛孙飞
2023-03-14

我将推荐一种方法,在某种程度上取决于以下问题的答案:

从消息提交到数据库到客户可以看到该消息,最大可接受的时间延迟是多少?

如果这个问题的答案是

尽管这可能会增加您的解决方案的复杂性,但这种方法的好处包括:

  • 数据库写入和读取之间无争用
  • 写入可以独立缩放
  • 您的书面数据可以以关系格式存储
  • 可以以最简化检索和显示问题的方式读取客户数据(例如,非规范化,与视图模型对齐)

将此应用到您的体系结构中,即使不使用某种持久的队列传输,实现读写分离仍然是可能的,但更难。而不是利用事件,您必须使整个事情命令驱动。

这里的主要区别是,您需要在主数据库写操作和随后对负责更新读模型的服务的调用中强制执行“可事务性”。

 类似资料:
  • 我需要使用单独的读者/作者MySQL服务器。一个写入程序和一个(或多个)读取复制副本。 最好的方法是什么? 我发现了很多例子: http://www.dragishak.com/?p=307 使用特殊的 JDBC 驱动程序: 用法是: https://stackoverflow.com/a/33169879/1974494 使用Spring < code > AbstractRoutingData

  • 我正在为我的API使用Spring Boot。我正在重写我的API,以采用微服务体系结构。 我有两门课: 1) 产品 2) 配料 我的代码: 以下是我的产品类别: 这是我的配料课: 在产品微服务中,我正在对成分微服务进行API调用: 但是,上面的getComponents()方法不起作用。 我的问题: 我想从Component microservice获取数据,但是,出现以下错误: “错误”:“内

  • 我读过萨姆·纽曼的《微服务》一书,在关于分裂整体的一章中,他举了一个“打破外键关系”的例子,他承认跨API进行连接会更慢--但他接着说,如果你的应用程序足够快,它比以前慢有关系吗? 这似乎有点油嘴滑舌?人的经历是什么?您使用了哪些技术来使API联接执行得令人满意?

  • 如果一个微服务只知道它自己的领域,但是有一个数据流需要多个服务以某种方式交互,那该怎么做呢? 假设我们有这样的东西: 为论证起见,假设一个订单发货后,就应该创建发票。 我确实知道这可以被认为是高度基于意见的。但它也有具体的一面,因为微服务不应该做上述的事情。因此,必须有一个“根据定义它应该做什么”,这不是基于意见的。 开枪啊。

  • 我想知道你是否能帮忙。我正在编写一个订单系统,目前已经实现了一个订单微服务来处理下订单。我正在使用DDD与事件源和CQRS。 订单服务本身接收生成事件的命令,实际的订单服务侦听自己的事件以创建读取模型(这里的想法是使用CQR,因此用于写入的命令和用于读取的查询) 在执行上述操作后,我遇到了一个问题,可能只是我没有完全理解正确的方法。 一个订单实际上有依赖项,这意味着一个订单需要一个客户和一个产品。

  • 问题内容: 我已经开发了两个Springboot michroservices exservice1和service2。具有service1依赖性的service2微服务。 我在service2 pom文件中添加了service1的依赖关系,并在运行service2时在eclipse中可以正常工作。但是,当我在Jenkins中部署并为service1创建项目(Jenkins Job)并以maven