3个版本
0.1.16-alpha.0 | 2023年4月1日 |
---|---|
0.1.12-alpha.0 | 2023年1月19日 |
0.1.10-alpha.0 | 2023年1月18日 |
#25 in #limiter
524 每月下载次数
用于 67 个crate(直接使用2个)
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