我正在处理涉及 3 个表的业务需求:我们有 3 个数据库表
- 产品(60列)
- CATEGORIZED_PRODUCTS(60 列):从表 PRODUCTS 中复制匹配的记录
- 类别
每当用户创建新类别时,我们必须从表 PRODUCTS 中查询与该类别匹配的产品列表,匹配条件由表 PRODUCTS 中的过滤列列表定义,例如:颜色为黄色,重量小于 10 公斤等...
然后我们将使用表 PRODUCTS 的返回结果中的主键,并创建一个批量 INSERT 到表 CATEGORIZED_PRODUCTS
基本上,我们有 3 个 SQL 语句:
No. 1 > 从表 PRODUCTS 中查询匹配记录(这个由另一个 API 端点完成)
No. 2 > 在表 Category 中创建新记录
No. 3 > 从表 PRODUCTS 中创建记录到表 CATEGORIZED_PRODUCTS
问题是,查询匹配产品的 API 需要 22 秒才能响应 25000 条记录,而该 API 来自另一个项目。但是我们(即:多个微服务 API)共享同一个数据库。
我们不能在这里使用事务(例如@Transactional),因为这会使最终用户等待太久。
我们需要为最终用户提供流畅的前端行为,这样,我们就不想让他们等待。那我只能考虑使用后端非阻塞异步机制,Backend API在Category创建后立即返回response(即:此时,我们跳过上面的2和3)
然后,对 2 号和 3 号使用异步(在失败的情况下重试3 次),然后
Query for matched from table PRODUCTS, then
Create records which primary keys received from table PRODUCTS into table CATEGORIZED_PRODUCTS with 1 SQL statement.
我们正在使用 Spring Boot、Spring JPA、Java 12、MySQL。请建议我在这种情况下使用非阻塞异步实现一些指南。
使用独立的批处理作业项目不是一种选择,因为目前它超出了时间跨度(由于公司管理)以及系统基础设施的范围。我们也无法在数据库中创建存储过程或函数。
PS:如果“更新”一个类别,我们必须删除表 CATEGORIZED_PRODUCTS 中的记录,然后我们再次处理 2 号和 3 号。
在“删除”一个类别的情况下,我们必须删除表 CATEGORIZED_PRODUCTS 中的记录,然后我们再次处理 2 号和 3 号。