#rate-limiting #limiter #limit #resources #bitcoin #helper #bitcoinleveldb

bitcoinleveldb-limiter

用于限制资源使用以避免耗尽的辅助抽象

3个版本

0.1.16-alpha.02023年4月1日
0.1.12-alpha.02023年1月19日
0.1.10-alpha.02023年1月18日

#25 in #limiter

Download history 123/week @ 2024-03-11 141/week @ 2024-03-18 266/week @ 2024-03-25 255/week @ 2024-04-01 114/week @ 2024-04-08 146/week @ 2024-04-15 152/week @ 2024-04-22 133/week @ 2024-04-29 179/week @ 2024-05-06 143/week @ 2024-05-13 146/week @ 2024-05-20 100/week @ 2024-05-27 111/week @ 2024-06-03 113/week @ 2024-06-10 140/week @ 2024-06-17 160/week @ 2024-06-24

524 每月下载次数
用于 67 个crate(直接使用2个)

MIT 许可证

265KB
635 代码行

bitcoinleveldb-limiter

bitcoinleveldb-limiter crate 为 Bitcoin 系统提供了一种简单的速率限制实现。

Limiter 类型实现了一种简单的令牌桶算法,其中令牌以恒定速率添加到桶中,可以通过调用 acquire() 进行消费。如果桶中没有足够的令牌,则 acquire() 方法将阻塞,直到有足够的令牌。还可以通过调用 release() 手动将令牌释放到桶中。

此crate不包含任何数学思想和方程。

注意:此crate是直接从C++到Rust翻译的Bitcoin Core的一部分。因此,某些函数体可能仍在翻译过程中。请注意,在翻译过程完成后,此系统将成为可测试的。

36> 如何在leveldb中使用速率限制器?

LevelDB中的速率限制器用于限制文件系统操作的速度。在需要控制磁盘I/O以防止资源争用或调节性能的场景中,这可能很有用。

可以通过将Limiter对象的指针传递给用于打开数据库的Options对象来启用速率限制器。可以使用 Limiter::new() 方法创建Limiter对象,该方法需要两个参数:读取或写入字节的速率(以字节每秒计)和突发大小(以字节计)。

一旦创建了限制器对象,就可以使用 acquire()release() 方法来调节文件系统操作的速率。在每次文件系统操作之前应调用 acquire() 方法,以确保不超过速率限制。在每次文件系统操作之后应调用 release() 方法来释放所获取的资源。

以下是一个在 Rust 中使用速率限制器的示例

use bitcoinleveldb_limiter::{Limiter, acquire, release};
use bitcoinleveldb::{Options, DB};

let mut opts = Options::new();
let limiter = Limiter::new(1024 * 1024, 1024 * 1024 * 10); // 1 MB/s, burst of 10 MB
opts.set_rate_limiter(limiter);

let db = DB::open(opts, "mydb").unwrap();

let key = "hello".as_bytes();
let value = "world".as_bytes();

acquire(limiter, value.len() as u64);
db.put(key, value);
release(limiter, value.len() as u64);

在这个示例中,速率限制器以 1 MB/s 的速率和 10 MB 的突发量创建。在调用 db.put() 之前,调用 acquire() 方法获取写入数据库所需的资源。写入完成后,调用 release() 方法释放获取的资源。

请注意,速率限制器仅适用于 LevelDB 执行的文件系统操作,例如将数据读入或写入磁盘。它不会调节 CPU 使用率或其他系统资源。

依赖关系

~89MB
~848K SLoC