我正在使用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的文档快照? 到目前为止,我还没有在测试中观察到这一点。我也没有看到其他人提到这种行为。我只是想知道这是否有可能,我应该在代码中加以照顾吗?
答案 0 :(得分:0)
从订户的角度来看,您不会收到看起来像是“撤消”对先前快照所做的更改的文档的快照。。
但是,请记住,在诸如Firestore之类的多客户端,可大规模扩展的系统中,无法真正确保订购。如果您有多个作家几乎同时阅读和更新某些文档,那么如果他们之间彼此不协调,则可能会遇到一致性问题。编写者应使用transactions以确保其读和写是一致的,并且不会互相干扰。如果您不协调作者,那么从订阅者的角度来看,他们的更改可能是随机出现的。