基于间隔的批处理器,用于 Redis 上的即发即弃命令
Interval Based Batch Processor For Fire And Forget Commands On Redis
我正在为加密货币构建一个交易引擎,并且由于交易引擎将被多个市场中的大量命令消耗,我想知道而不是使用默认模式,比如为那里的每个命令发出威胁可以是一个数据库,它可以在短时间内保存命令并批量执行它们。
我想知道这是否是个好主意,是否有可用于我的数据库的模式或交付机制?
这里的问题似乎集中在发出 redis 命令时 CPU 阻塞,并提到了 fire and forget。
在一般情况下,是:对于任何客户端,阻塞同步调用,例如:
redis.call("incr", "foo");
将阻塞当前线程以进行延迟实例,但是:不同的客户端具有不同的功能;假设我们使用 StackExchange.Redis 作为库,并比较:
db.StringIncrement("foo"); // blocks current thread
不过,我们在这里有一些选择:
// doesn't block thread, completes asynchronously, reactivated via task model with result
await.StringIncrememtAsync("foo");
// doesn't block thread; result is meaningless (default(T))
db.StringIncrement("foo", flags: CommandFlags.FireAndForget);
// doesn't block thread, completes synchronously via a completed task with
// meaningless result (default(T))
await db.StringIncrementAsync("foo", flags: CommandFlags.FireAndForget);
所以有多种方法可以避免CPU阻塞。
至于批处理:在某些情况下,批处理可以帮助减少数据包碎片,但由于我们使用“管道”作为层之间的缓冲区,如果有的话,我们已经可以很好地创建密集数据包了是足够的数据,如果 没有 足够的数据来填充数据包:早点发送它们并避免 latency/buffering 并没有什么坏处;除非你在附近发送多个 related 命令,批处理 API 通常不会立即有用(当你 are 发送多个相关命令 - 它也可能对 compare/contrast 批处理与事务 APIs 有用。
我正在为加密货币构建一个交易引擎,并且由于交易引擎将被多个市场中的大量命令消耗,我想知道而不是使用默认模式,比如为那里的每个命令发出威胁可以是一个数据库,它可以在短时间内保存命令并批量执行它们。 我想知道这是否是个好主意,是否有可用于我的数据库的模式或交付机制?
这里的问题似乎集中在发出 redis 命令时 CPU 阻塞,并提到了 fire and forget。
在一般情况下,是:对于任何客户端,阻塞同步调用,例如:
redis.call("incr", "foo");
将阻塞当前线程以进行延迟实例,但是:不同的客户端具有不同的功能;假设我们使用 StackExchange.Redis 作为库,并比较:
db.StringIncrement("foo"); // blocks current thread
不过,我们在这里有一些选择:
// doesn't block thread, completes asynchronously, reactivated via task model with result
await.StringIncrememtAsync("foo");
// doesn't block thread; result is meaningless (default(T))
db.StringIncrement("foo", flags: CommandFlags.FireAndForget);
// doesn't block thread, completes synchronously via a completed task with
// meaningless result (default(T))
await db.StringIncrementAsync("foo", flags: CommandFlags.FireAndForget);
所以有多种方法可以避免CPU阻塞。
至于批处理:在某些情况下,批处理可以帮助减少数据包碎片,但由于我们使用“管道”作为层之间的缓冲区,如果有的话,我们已经可以很好地创建密集数据包了是足够的数据,如果 没有 足够的数据来填充数据包:早点发送它们并避免 latency/buffering 并没有什么坏处;除非你在附近发送多个 related 命令,批处理 API 通常不会立即有用(当你 are 发送多个相关命令 - 它也可能对 compare/contrast 批处理与事务 APIs 有用。