我正在寻找构建一个 Java11 Spring 启动应用程序。该应用程序要处理非常大的吞吐量(会有峰值和低流量)
应用程序的幸福路径如下所示。
从概念上讲,它相当简单。步骤大致如下
- 接受传入的 POST 请求。保存端点处的 DTO 对象。
- 应用程序将验证 DTO,如果无效则返回相关错误消息。
- 转换为数据库实体对象
- 将实体保存到 Postgres 数据库。
我们对这个应用程序的潜在问题是,它将根据每个请求进行数据库保存,并进行大量单独的保存。数据库连接池可能会很快耗尽所建立的更多连接。
我的替代方法如下所示
一旦传入的 DTO 通过验证并在内存队列中排队,我希望返回状态 200。
这里没有外部阻塞,如果数据库出现故障,这意味着内部队列将提供一些冗余。
一些问题/想法
- 这看起来是个好方法吗?我应该避免哪些陷阱吗? 密切注意,提防,小心?
- 也许您已经在更好的/中解决了类似的问题 不同的方式?
- 响应式(Reactive)流有什么帮助吗?
- 为此我应该使用哪些内部 Java 库?我的
想法是使用Java的LinkedList
Queue<SomeDto> myQ = new LinkedList<SomeDto>(); )
用于内部排队?
最佳答案
如果应用程序因内部队列中的数据而失败,会发生什么情况?或者内存中的保存操作是否溢出?
如果您想构建更强大的东西,您可以考虑使用事件日志解决方案(例如基于 Kafka),其中消费者填充数据库(Kafka 将取代您的内部队列)。
但是,在这里很难真正回答您的问题,因为必须考虑许多其他因素。
我建议你读一本类似Designing Data-Intensive Applications的书:这绝对是一个宝贵的资源,它将帮助您根据您的需求和环境设计可靠的解决方案。
关于java - 使用外部数据库处理非常大的吞吐量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56755559/