【问题标题】:Can Firestore real time updates come out of order?Firestore 实时更新会出现故障吗?
【发布时间】:2023-04-09 17:25:01
【问题描述】:

我正在使用 Java 管理 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 彼此非常接近,我可以在时间 t1 的文档快照之前获得时间 t2 的文档快照吗? 到目前为止,我还没有在测试中观察到这一点。我也没有看到其他人提到过这种行为。我只是想知道这是否有可能,我应该在我的代码中处理它吗?

【问题讨论】:

    标签: java firebase google-cloud-firestore


    【解决方案1】:

    从订阅者的角度来看,您不会收到似乎“撤消”先前快照中所做更改的文档快照

    但是,请记住,在 Firestore 等多客户端、可大规模扩展的系统中,实际上无法确保排序。如果您有多个编写者几乎同时阅读和更新某个文档,那么如果他们没有相互协调,您可能会遇到一致性问题。作者应该使用transactions 来确保他们的读写是一致的并且不会相互干扰。如果您不协调作者,从订阅者的角度来看,他们的更改可能是随机的。

    【讨论】:

    • 如果我对您的理解正确,如果作者负责更新事务中的文档,订阅者将永远不会看到同一文档的较新快照和较旧快照。这种理解正确吗?我的案例相当简单,作者仅根据条件修改文档中的布尔标志。如果 2 个不同的作者对文档进行 2 次快速更新——其中一个将标志设置为 true,然后另一个将其设置为 false,我担心是否会有订阅者看到标志为 false 的快照的情况后跟标志为真?
    猜你喜欢
    • 2012-12-08
    • 1970-01-01
    • 2017-12-23
    • 2021-05-30
    • 1970-01-01
    • 1970-01-01
    • 2016-07-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多