データベースなんも分からん。
たまにエラーが発生するクエリー、手元でテストのテーブル作って試す限りでは再現できない。
一つ目が、キュー代わりに使っているテーブルからFOR UPDATE SKIP LOCKEDしているクエリーで、一日に一回ぐらい同じレコードが採れてしまう問題。
二つ目が、INSERT INTO ON CONFLICT DO UPDATE SETで無ければシーケンス付き挿入、有れば更新している処理で重複エラーが発生する問題。更新の時にもシーケンスが進んでしまうのがいやで、セットでシーケンスをテーブル最大値に再セットしているのが悪いんだと思うが、うーん。
根本原因が分からないまま、ON CONFLICTに頼らず事前にレコードがあるか調べてINSERTとUPDATEに振り分ける、とりあえずの対策を入れた。
思考の /dev/null
二つ目が、INSERT INTO ON CONFLICT DO UPDATE SETで無ければシーケンス付き挿入、有れば更新している処理で重複エラーが発生する問題。更新の時にもシーケンスが進んでしまうのがいやで、セットでシーケンスをテーブル最大値に再セットしているのが悪いんだと思うが、うーん。