具有Firebase侦听器的后端java应用程序的多个实例出现问题

具有Firebase侦听器的后端java应用程序的多个实例出现问题,java,spring,firebase,docker,firebase-realtime-database,Java,Spring,Firebase,Docker,Firebase Realtime Database,我在一个后端java应用程序(使用Spring)中工作,该应用程序在docker中运行。此应用程序具有Firebase实时侦听器。在本地它工作得很完美!但是,当我在Docker中部署它并创建2个实例(容器)时,当我在Firebase RTDB中进行更改时,它开始运行2次相同的逻辑(应该只执行一次)。这是我在Bean中创建侦听器的代码: FirebaseOptions options; options = new FirebaseOptions.Builder() .setServ

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

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");
      }
    });

有没有办法让它只工作一次,即使它有两个实例?如果没有,我该怎么办?(仅使用一个容器不是有效的解决方案-由于高可用性)

Firebase SDK无法知道是否有多个自身实例在运行并在它们之间协调。您看到的是预期的行为。如果您只需要监听数据库中某个位置的一件事,那么您只需要有一个实例,或者您需要使用事务以一种复杂的方式自己进行协调。如果希望复制其逻辑,则有一个名为的节点项目可以有效地执行此协调

但是,如果您的后端逻辑在数据库中每次更改都需要运行一次,那么您最好使用来管理它