一个涉及java微服务接口调用及数据库查询的问题?
大家好,请看我的问题:
现有微服务A、微服务B,两个服务链接的是不同的数据库而且不在同一个机器上。
微服务A中的数据库人员表(base_user)存放了一万条人员信息,微服务B中需要调用A的接口,将没有调入过的人员列表查询出来(然后在前端勾选后调入到B的sys_user表中)。
我的实现方式是:
首先从B的sys_user中查询出所有的人员id列表,然后通过该id列表调用A的接口,A的接口执行mysql(下面语句省略了分页,实际项目是分页的):
select * from base_user where id not in ('1','2',......)
这种方式在sys_user中人员数量较少的情况下还算可以,但是随着调入人员的增加,A接口的速度越来越慢,因为not in 的id列表太大了。
select * from base_user where id not in ('1','2',此处省略9000个id)
请问大神们,有没有其他的实现方式或者mysql上可以优化的地方呢?
谢谢!
回答:
1.分批处理
2.用 JOIN 而不是 IN
3.使用临时表
4.异步处理
5.用缓存
回答:
目的是把A服务中的表A(base_user)导入到B服务的表B(sys_user)中去,可以考虑使用消息队列来同步。
表A数据发生变化(增删改操作),发送消息
微服务B消费消息,判断数据,更新变化
回答:
- 可以考虑数据同步后做冗余(可能涉及到数据一致性问题, 以及引入中间件造成的复杂度和可靠性问题), 后在同一个数据库中优化查询
- 通过forkjoin进行异步处理
- 考虑使用Redis缓存聚合两个数据库中的数据, 直接输出结果, 同样需要考虑缓存一致性问题
以上是 一个涉及java微服务接口调用及数据库查询的问题? 的全部内容, 来源链接: utcz.com/p/945200.html