私はテーブルを持っています、フー。特定のイベントでこのテーブルに行を追加します。現在の全体的な設計では、メッセージの重複は避けられません。これにより、重複する行がテーブルに追加されます。
このテーブルの行になるさまざまな種類のメッセージがあるため、テーブルに一意の制約を設定できません。特定の種類のメッセージのみ重複を避けたい。
重複したメッセージが同時に送信されることが多く、そのアプリケーションは複数のノードで実行されるため、radisson を使用して分散ロックを取得することにしました。ただし、機能していないようです。私はまだテーブルに重複した行を取得しています。
重複メッセージは、userId、日付、およびタイプに基づいて検出されます。以下は最小限のデモコードです。書き込みの前に読み取りを実行しようとしていますが、この読み取りはアプリケーション ノード間で同期されたブロックで行われています。
これに関するご意見をお待ちしております。
if(updateEntry.getType().equals(Type.XYZ) {
java.sql.Date date = updateEntry.getDate();
String redisLockKey = "MyAPP" + "-" + userId+"-"+date.toString()+ "-" + "type-XYZ";
RLock rLock = redissonClient.getLock(redisLockKey);
rLock.lock(5, TimeUnit.SECONDS);
MyEntity myEntity = myEntityRepository.findByUserIdAndDateAndActivityType(userId,date,Type.XYZ);
if(null == myEntity) {
myEntity = new MyEntity();
// myEntity setters
myEntity = myEntityRepository.saveAndFlush(myEntity);
}
rLock.unlock();
}