我们在做延时任务的时候,任务量很大,需要用到很多个任务系统节点来执行。
通常情况下,我们用轮询的方式来解决,给一个自增的 ID,然后与服务器数量,取模,进行发送数据。
client = [client1, client2, client3]
auto_id = 0
def get_client():
global auto_id
auto_id += 1
return client[auto_id % len(client)]
因为延时任务,不是马上执行,需要取消,或者更改延时时间。
所以我们必须知道任务发送给了那台任务系统,这时 hashring 派上用场了。
通过 hashring 我们可以确定每个任务发送给哪台任务系统,我们可以进行任务的取消,或更新。
from uhashring import HashRing
nodes = {}
nodes['host1'] = {
'hostname': host1,
'instance': client1
}
nodes['host2'] = {
'hostname': host2,
'instance': client2
}
nodes['host3'] = {
'hostname': host3,
'instance': client3
}
hr = HashRing(nodes=nodes, hash_fn='ketama')
def get_client(name):
return hr[name]
同一个任务名称可以获取到同一个任务系统节点, 我们的要求就满足了。
网友评论