2017-08-24 17 views
0

現在、CassandraをNoSQLデータベースとして使用し、GemFireをIn Memoryデータベースとして使用しています。私たちはGemFire CacheWriterを使ってCassandraにレコードを挿入しています。 CacheWriter内のConcurrentスレッドを使用してレコードを挿入/更新することは、エンジニアリングの慣行であるかどうかについてのご意見をお待ちしています。これに関するあなたのご意見は高く評価されます。GemFire CacheWriterの同時スレッド

public class GenericWriter<K, V> extends CacheWriterAdapter<K, V> implements Declarable { 

    private static Logger log = LoggerFactory.getLogger(GenericWriter.class); 

    @Autowired 
    private CassandraOperations cassandraOperations; 

    ExecutorService executor = null; 

    @Override 
    public void beforeCreate(EntryEvent<K, V> e) { 

    executor = Executors.newSingleThreadExecutor(); 

     executor.submit(() -> { 
      if (eventOperation.equals("CREATE") || eventOperation.equalsIgnoreCase("PUTALL_CREATE")) { 
       try { 
        cassandraOperations.insert(e.getNewValue()); 
       } catch (CassandraConnectionFailureException | CassandraWriteTimeoutException 
         | CassandraInternalException cassException) { 
       } catch (Exception ex) { 
        log.error("Exception in GenericCacheWriter->" + ExceptionUtils.getStackTrace(ex)); 
        throw ex; 
       } 
      } 
     }); 
     executor.shutdown(); 
    } 

    @Override 
    public void init(Properties arg0) { 
     // TODO Auto-generated method stub 

    } 
} 
+0

両方の答えが正しいです。誰も私に両方を受け入れる方法を教えてもらえますか – Vigneshwaran

答えて

1

はい、それは良いパターンですが、Executorを削除し、GemFireへのすべてのアップデートが1つのノードだけになるようにデータを分割します。同様にカサンドラを分割する。カサンドラのアップデートの周りに書き込みロックを入れてください。スループットが低い場合にのみ使用してください。

高いスループットが必要な場合は、AsyncEventListenerを使用し、最終的な整合性をユーザーに保証します。 AELでExecutorsを使用する必要がある場合は、メインスレッドで例外をスローするようにExecutorsを使用してください。何回か試行した後で更新が失敗した場合は、失敗したエントリを数秒または1分の有効期限を持つ別の領域に書き込みます。期限が切れたら、操作を再試行してください。成功するまでこの作業を続け、期限切れのエントリを削除します。

アップデートの順序が重要であるかどうかを確認するには、バージョン番号と古い値/新しい値を見ているものを追跡する必要があります。

3

CacheWriterハンドラが同期的に呼び出されるため、アプリケーションは、ハンドラが戻るまで継続しません。したがって、このリスナー内で長時間実行される操作を実行することはお勧めしません。長時間実行する操作が必要な場合は、代わりにAsyncEventListenerを使用して操作を非同期に処理することを検討してください。

ExecutorServiceを使用して実行を別のスレッドに委譲することは可能ですが、フェイル・ファースト・プロパティーを実装しなくなり、イベントの処理がもはや同期しないため、アンチ・パターンです。アプリケーションのイベントの完了に関連して保証されません。

このトピックについて詳しくは、Geode WikiのCacheWrite and CacheListener Best Practicesを参照してください。

これが役に立ちます。

よろしくお願いいたします。

+0

このアプローチに同意します。 AEQ + AsyncEventListenerを使用する方がずっと適切です。これは "write-behind"と呼ばれるものです。詳細については、docsを参照してください... http://gemfire.docs.pivotal.io/geode/developing/events/implementing_write_behind_event_handler.html –

関連する問題