背景:我有一个迷你聊天应用程序,可以让你为许多对话者创建聊天室。一组对话者的聊天室只能创建一次,因此,如果使用同一组对话者创建聊天室的请求执行两次,则只需创建一个聊天室:
因此:
。
基本上,这是一个简单的多对多的关系,有三个表: chat_rooms、chat_room_interlocutor和对话者。
当使用单个线程环境时,似乎一切都很好,然而,在多线程上,我为同一组对话者提供了重复的聊天室。这似乎是一个典型的并发问题,可以通过锁定机制来解决,但是,当两个或多个微服务实例可用时,则应该将锁定委托给数据库级别。
因为我使用Spring,所以我尝试在JPA查询上使用@Lock(LockModeType.PESSIMISTIC_READ),但是第二个线程不会挂在查询上并创建重复的聊天室。该查询如下所示:
select c.chat_id from chat c
join chat_interlocutor c1 on c1.chat_id = c.chat_id and c1.interlocutor_id = ?1
join chat_interlocutor c2 on c2.chat_id = c.chat_id and c2.interlocutor_id = ?2整个场景如下:
Microservice1
interlocutor2)
)
Microservice2
发布于 2021-07-06 07:40:06
您最简单的解决方案是使用数据库中唯一的聊天室id作为同步机制(因为这是在微服务之间共享的)。
为此,您必须在会话启动时创建聊天室实体。您必须确保始终使用从2名参与者中确定的唯一ID创建它。如果创建工作,那么这是一个新的聊天室,如果有一个独特的密钥违反,那么聊天室已经存在。
您所描述的流程几乎是正确的,但是您错过了创建数据库中的聊天室的过程,该聊天室具有由microservice构建的唯一id。您仍然需要检查聊天室是否已经存在,因为这样可以避免太多的冲突。
https://stackoverflow.com/questions/68259252
复制相似问题