使用Firebase侦听器的后端Java应用程序的多个实例的问题

我正在运行在docker中的后端Java应用程序(使用Spring)中工作。 此应用程序有一个Firebase实时监听器。 在本地它是完美的! 但是,当我在Docker中部署它并创build2个实例(容器)时,当我在Firebase RTDB中进行更改(它应该只执行一次)时,它开始运行相同的逻辑2次。 这是我在Bean中创build侦听器的代码:

FirebaseOptions options; options = new FirebaseOptions.Builder() .setServiceAccount(new FileInputStream(resourceDir + File.separator +"test1.json")) .setDatabaseUrl("https://test1.firebaseio.com/").build(); FirebaseApp.initializeApp(options); final FirebaseDatabase database = FirebaseDatabase.getInstance(); DatabaseReference listenerRef; DatabaseReference commerceRef; commerceRef.orderByChild("got").equalTo(0).addChildEventListener(new ChildEventListener() { @Override public void onChildAdded(DataSnapshot dataSnapshot, String prevChildKey) { LOGGER.info("data changed:" + dataSnapshot.getKey()); LOGGER.info("data ref:" + dataSnapshot.getRef()); ......logic .... } catch (Exception e) { LOGGER.info("Error en recepcion de actualizaciones de firebase" + e.getMessage(), e); } } @Override public void onCancelled(DatabaseError databaseError) { LOGGER.error("The read failed: " + databaseError.getCode()); } @Override public void onChildChanged(DataSnapshot arg0, String arg1) { LOGGER.info("Uno de los hijos fue modificado"); } @Override public void onChildMoved(DataSnapshot arg0, String arg1) { LOGGER.info("Uno de los hijos fue reubicado"); } @Override public void onChildRemoved(DataSnapshot dataSnapshot) { LOGGER.info("Uno de los hijos fue removido"); } }); 

有没有办法使它一次工作,即使它有2个实例? 如果不是,我该怎么办? (只使用一个容器,这不是一个有效的解决scheme – 由于高可用性)

Firebase SDK无法知道是否有多个本身正在运行的实例在它们之间进行协调。 你所看到的是预期的行为。 如果你只想听一个数据库中的一个位置,你只需要一个实例,或者你需要使用事务以一种复杂的方式进行协调。 有一个名为firebase-queue的节点项目可以有效地执行这种协调,如果你想复制它的逻辑。

但是如果您的后端逻辑需要在数据库的每次更改中运行一次,那么使用Firebase的Cloud Functions来pipe理该function可能会更好。