利用hashring进行客户端集群

2020-12-07  本文已影响0人  Lupino

我们在做延时任务的时候,任务量很大,需要用到很多个任务系统节点来执行。

通常情况下,我们用轮询的方式来解决,给一个自增的 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]

同一个任务名称可以获取到同一个任务系统节点, 我们的要求就满足了。

上一篇下一篇

猜你喜欢

热点阅读