- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我正在考虑实现一个 MongoDB 变更流读取器,我想确保我做的是正确的。有很多关于如何实现实际阅读器代码的简单示例,包括 official documentation ,我不太担心这方面的问题。
不过,我有点担心读者落后于变化流,无法 catch 变化流,我想确保读者能够处理变化流。
mongo 服务器是一个集群,为了便于论证,我们假设它在一天中的所有时间都非常繁忙。更改流 API 似乎只与执行工作的单个实例兼容,因为它必须如何迭代流结果而不是像队列一样对其进行操作。因此,我担心迭代结果的单个实例可能比将新项目推送到流中花费更长的时间来完成它的工作。
我的直觉是让读者简单地读取流,批处理更改,然后将其推送到队列中,其他工作人员可以在队列中横向扩展以完成工作。但是,我仍然有一个作为读取器的实例,理论上它仍然有可能落后于流,即使只做了将更改推送到队列中的最低限度的工作。
所以我的问题是,这种担心有多现实?是否有任何方法可以创建读取器,即使它只是将更改流式传输到工作队列中,它也可以水平扩展?我还应该考虑哪些其他注意事项?
最佳答案
最有可能的是,只需将所有工作委派给水平缩放的队列,单个阅读器就足够了。
如果事实证明这还不够,并且您的读者仍然需要水平缩放,那么您可以通过使用匹配过滤器来实现这一点,这种方式允许多个读者分担工作。
例如,如果您有一个包含十六进制字符的 ID,您可以通过在每个服务器上使用匹配运算符将工作拆分到两个服务器上,其中每个服务器匹配整个范围内的一半字符:
// Change Stream Reader 1
const params = [
{ $match: { _id: /^[0-7]/ } }
];
const collection = db.collection('inventory');
const changeStream = collection.watch(params);
在第二台机器上:
// Change Stream Reader 2
const params = [
{ $match: { _id: /^[8-9a-f]/ } }
];
const collection = db.collection('inventory');
const changeStream = collection.watch(params);
如果您需要超过 16 台服务器,那么您可以使范围更加具体:
// Server 0 matches on /^0[0-7]/
// Server 1 matches on /^1/
// ...
// Server 15 matches on /^f/
// Server 16 matches on /^0[8-9a-f]/
这将允许每台机器观看消息的子集并处理它们,而其他机器正在处理其他消息而不会重复。
以稳健的方式协调哪个服务器正在监视哪个范围变得有些复杂,因为您需要确保崩溃或挂起的机器恢复,如果您需要动态地水平扩展,那么您需要能够向服务器提供新的范围并调整大小。此解决方案还会导致消息被乱序处理,因此如果顺序很重要,那么您需要想出一个解决方案来重新排序消息或处理乱序问题。
但是这些都是与这个问题不同的主题,所以我现在将省略细节。
关于mongodb - 什么是 MongoDB 更改流读取器的良好水平扩展策略?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54295043/
嗨,我正在考虑开发一种文件传输程序,想知道我是否想要尽可能好的加密,我应该使用什么? 我会用 C# 开发它,所以我可以访问 .net 库 :P在我的 usb 上有一个证书来访问服务器是没有问题的,如果
我创建的这个计算两个数组的交集是线性的方法的复杂度(在良好、平均、最差的情况下)? O(n) public void getInt(int[] a,int[] b){ int i=0; int
我已经能够使用 RTCPeerConnection.getStats() API 获得 WebRTC 音频调用的各种统计信息(抖动、RTT、丢包等)。 我需要将整体通话质量评为优秀、良好、一般或差。
基本问题: 如果我正在讲述/修改数据,我应该通过索引硬编码索引访问文件的元素,即 targetFile.getElement(5);通过硬编码标识符(内部翻译成索引),即 target.getElem
在 Linux 上,我想知道要调用什么“C”API 来获取每个 CPU 的统计信息。 我知道并且可以从我的应用程序中读取 /proc/loadavg,但这是系统范围的负载平均值,而不是每个 CPU 的
在客户端浏览器中使用 fetch api,GET 或 POST 没有问题,但 fetch 和 DELETE 有问题。它似乎将 DELETE 请求方法更改为 OPTIONS。 大多数研究表明是一个cor
我是一名优秀的程序员,十分优秀!