2016-04-06 1 views
0

私はdjangoでセロリを実行しています。タスクを使用して、オブジェクトのストリームをデータベースにインポートします。各タスクは1つのオブジェクトをインポートします。並行性はストリーム内では2です。オブジェクトは複製できますが、私のデータベース内にあるべきではありません。私が実行しているよdjango /セロリデータのインポートで既存のデータがチェックされない

コード:

if qs.exists() and qs.count() == 1: 
    return qs.get() 
elif qs.exists(): 
    logger.exception('Multiple venues for same place') 
    raise ValueError('Multiple venues for same place') 
else: 
    obj = self.create(**defaults) 

問題は、ストリーム内のオブジェクトが重複し、互いに非常に接近している場合、アプリはまだ二度同じオブジェクトをインポートしていることです。

DBチェックがこの並行処理設定で正しく機能していないと仮定します。この問題を解決するにはどのアーキテクチャをお勧めしますか?

答えて

1

ロックアーキテクチャを使用する必要があります。したがって、2つのタスクが同時にオブジェクトフェッチパートを実行するのをブロックします。python-redis-lockを使用してください。

+0

よろしくお願いします。それのために行くだろう! fyi私の暫定的な解決策は、dbが一貫性を保つことを少なくとも保証するために、2つの列にユニークな制約を設けることでした。発生したエラーはセロリのタスクを殺します。それは今よりブルートフォースのような試みです。 – patroqueeet