code: @Local
      public CompletableFuture<Integer> broadcastAction(final WebSocketAction action) {
          if (this.localEngine != null && this.sncpNodeAddresses == null) { //本地模式且没有分布式
              return this.localEngine.broadcastLocalAction(action);
          }
          CompletableFuture<Integer> localFuture = this.localEngine == null ? null : this.localEngine.broadcastLocalAction(action);
          tryAcquireSemaphore();
          CompletableFuture<Collection<InetSocketAddress>> addrsFuture = sncpNodeAddresses.getCollectionAsync(SOURCE_SNCP_ADDRS_KEY, InetSocketAddress.class);
          if (semaphore != null) addrsFuture.whenComplete((r, e) -> releaseSemaphore());
          CompletableFuture<Integer> remoteFuture = addrsFuture.thenCompose((Collection<InetSocketAddress> addrs) -> {
              if (logger.isLoggable(Level.FINEST)) logger.finest("websocket broadcast action (" + action + ") on " + addrs);
              if (addrs == null || addrs.isEmpty()) return CompletableFuture.completedFuture(0);
              CompletableFuture<Integer> future = null;
              for (InetSocketAddress addr : addrs) {
                  if (addr == null || addr.equals(localSncpAddress)) continue;
                  future = future == null ? remoteNode.broadcastAction(addr, action)
                      : future.thenCombine(remoteNode.broadcastAction(addr, action), (a, b) -> a | b);
              }
              return future == null ? CompletableFuture.completedFuture(0) : future;
          });
          return localFuture == null ? remoteFuture : localFuture.thenCombine(remoteFuture, (a, b) -> a | b);
      }
docs: 广播操作， 给所有人发操作
  
  @param action 操作参数
  
  @return 为0表示成功， 其他值表示部分发送异常