Firestore实时更新会出现故障吗?

时间:2018-12-28 13:44:47

标签: java firebase google-cloud-firestore

我正在使用Java admin SDK在GCE实例中运行的服务中侦听Firestore中集合中文档的更改。我在查询快照侦听器中使用具有单个线程的Executor,以确保接收到的事件按照到达的顺序进行串行处理。代表性示例如下:

public class ListenerClass implements EventListener<QuerySnapshot> {
    Map<String, Object> documentMap = new HashMap<String, Object>();

    public void onEvent(QuerySnapshot querySnapshot, FirestoreException error) {
        for (DocumentChange dc : querySnapshot.getDocumentChanges()) {
            switch (dc.getType()) {
            case ADDED:
            case MODIFIED:
                documentMap.put(dc.getDocument().getId(), dc.getDocument().getData());
                break;
            case REMOVED:
                documentMap.remove(dc.getDocument().getId());
                break;
            }
        }
    }
}

public class WatchService {
    public static void main(String[] args) {
        WatchService watchService = new WatchService();
        watchService.watch();
    }

    public void watch() {
        //Initialize Firebase and get firestore instance

        Executor executor = Executors.newFixedThreadPool(1);
        ListenerClass listenerClass = new ListenerClass();
        firestore.get("collection_name").addSnapshotListener(executor, listenerClass);

        //wait
    }
}

我想知道Firestore是否有可能不按顺序发送事件。例如,如果文档A在时间t1和t2更新。如果t1和t2彼此非常接近,是否可以在t2的文档快照之前获得t2的A的文档快照? 到目前为止,我还没有在测试中观察到这一点。我也没有看到其他人提到这种行为。我只是想知道这是否有可能,我应该在代码中加以照顾吗?

1 个答案:

答案 0 :(得分:0)

从订户的角度来看,您不会收到看起来像是“撤消”对先前快照所做的更改的文档的快照。。

但是,请记住,在诸如Firestore之类的多客户端,可大规模扩展的系统中,无法真正确保订购。如果您有多个作家几乎同时阅读和更新某些文档,那么如果他们之间彼此不协调,则可能会遇到一致性问题。编写者应使用transactions以确保其读和写是一致的,并且不会互相干扰。如果您不协调作者,那么从订阅者的角度来看,他们的更改可能是随机出现的。