小编aed*_*edm的帖子

MongoDB Change Streams性能严重下降

我想获得有关Node.js中MongoDB数据库更改的实时更新.

单个MongoDB更改流几乎立即发送更新通知.但是当我打开多个(10+)流时,数据库写入和通知到达之间会有大量延迟(最多几分钟).

这就是我设置更改流的方式:

let cursor = collection.watch([
  {$match: {"fullDocument.room": roomId}},
]);
cursor.stream().on("data", doc => {...});
Run Code Online (Sandbox Code Playgroud)

我尝试了另一种设置流的方法,但它同样慢:

let cursor = collection.aggregate([
  {$changeStream: {}},
  {$match: {"fullDocument.room": roomId}},
]);
cursor.forEach(doc => {...});
Run Code Online (Sandbox Code Playgroud)

自动化流程将微小文档插入到集合中,同时收集性能数据.

一些额外的细节:

  • 开放流游标数:50
  • 写入速度:100 docs /秒(10个批次使用insertMany)
  • 运行时间:100秒
  • 平均延迟:7.1秒
  • 最大延迟:205秒(不是拼写错误,超过三分钟)
  • MongoDB版本:3.6.2
  • 群集设置#1:MongoDB Atlas M10(3副本集)
  • 群集设置#2:Docker中的DigitalOcean Ubuntu框+单实例mongo群集
  • Node.js CPU使用率:<1%

两种设置都会产生同样的问题.这可能会发生什么?

mongodb

25
推荐指数
1
解决办法
3429
查看次数

如何关闭其他板条箱发出的跟踪事件?

我使用跟踪,我只想查看我自己的调试事件。然而,我依赖的一些板条箱也有跟踪支持,它们会乱七八糟的事件流。因此,当我将详细程度增加到 时DEBUG,我会在日志中看到很多这样的内容:

2022-08-04T20:52:24.523161Z DEBUG hyper::proto::h1::io: flushed 1008 bytes
Run Code Online (Sandbox Code Playgroud)

我尝试通过在此类调用周围添加跨度来关闭这些事件:

let response = {
    let span = tracing::info_span!("my_span");
    let _guard = span.enter();
    client
        // set up the request
        .send()
        .await
};
Run Code Online (Sandbox Code Playgroud)

我预计这些第 3 方DEBUG事件会消失,因为跨度的详细程度为INFO。但他们留下了。Span 的文档对Span 的详细程度的真正含义有些了解,所以我的解释可能完全错误。

如何设置依赖包的详细级别,以便只有我自己的DEBUG事件出现在跟踪日志中?

我使用环境变量设置详细级别RUST_LOG=debug,并设置跟踪订阅者,如下所示:

tracing_subscriber::fmt::init();
Run Code Online (Sandbox Code Playgroud)

相关部分Cargo.toml

tracing = "0.1.36"
tracing-subscriber = { version = "0.3", features = ["env-filter"] }
Run Code Online (Sandbox Code Playgroud)

rust rust-tracing

12
推荐指数
1
解决办法
5415
查看次数

Meteor 1.3 + React:检测订阅失败?

我有一个简单的Meteor订阅,我在加载数据时显示加载消息.但是,如果订阅失败,我不知道如何显示错误消息.

export const MyAwesomeComponent = createContainer(() => {
  let sub = Meteor.subscribe('some-data');
  if (!sub.ready()) return { message: 'Loading...'};
  if (sub.failed()) return { message: 'Failed.' }; // How to do this?
  return {
    data: Data.find().fetch()
  }
}, MyInternalRenderComponent);
Run Code Online (Sandbox Code Playgroud)

问题是,订阅对象没有failed()方法,只有ready()查询.如何将订阅失败作为createContainer()方法中的道具传递?

我知道这个Meteor.subscribe方法有一个onStop回调用于这种情况,但我不知道如何粘合它以传递属性.

meteor meteor-publications meteor-react

5
推荐指数
1
解决办法
155
查看次数

如何使用 type_info 判断类型是否是子类?

我将 C++ 与 RTTI 一起使用。我有一个type_info班级。如果我只有 ,我如何判断另一个类是否是第一个类的子类type_info

#include <typeinfo>

class Foo             { public: virtual ~Foo() {} };
class Boo: public Foo { public: virtual ~Boo() {} };
class Bar             { public: virtual ~Bar() {} };

template<class T>
bool instanceOf(const type_info& info) {
  // ANSWER COMES HERE!!
}

int main(int argc, const char* argv[]) {
  const type_info& fooInfo = typeid(Foo);
  const type_info& barInfo = typeid(Bar);

  bool booIsFoo = instanceOf<Boo>(fooInfo); // should be true
  bool booIsBar = instanceOf<Boo>(barInfo); // …
Run Code Online (Sandbox Code Playgroud)

c++ rtti

4
推荐指数
1
解决办法
2821
查看次数

为什么“if return”在 Rust 中编译?

我在 dtolnay 令人费解的 Rust测验中发现了一些奇怪的 Rust 代码。显然,这是一个有效的 Rust 程序(playground):

fn main() {
    if return { print!("1") } {}
}
Run Code Online (Sandbox Code Playgroud)

根据Rust 文档

if 表达式的语法是一个条件操作数,后跟一个后续块、任意数量的 else if 条件和块,以及一个可选的尾部 else 块。条件操作数必​​须具有布尔类型。

对我来说,这意味着该return语句必须以某种方式计算为布尔值,否则代码将无法编译。但这种解释似乎很奇怪,我怀疑肯定还有其他原因。

那么为什么要if return编译呢?

rust

3
推荐指数
1
解决办法
127
查看次数

如何汇总Google Spreadsheets中每列的最大值?

我有一个Google电子表格的数字.如何从每列中获取最大值,并仅使用一个公式对其进行汇总?(没有临时单元,没有脚本.)

1  2  1
0  1  3
0  2  0
Run Code Online (Sandbox Code Playgroud)

对于上表,结果应为6(1 + 2 + 3,每列的最大值).但我想要一个适用于更大表的解决方案.

作为一个更普遍的问题,我想看看我怎么能折叠的2D范围为使用任意运营商一维数组(像MAXSUM在这种情况下).

google-sheets

2
推荐指数
1
解决办法
844
查看次数