Как указать получателю beanstalk c ждать X секунд перед резервированием задачи? - PullRequest
0 голосов
/ 06 августа 2020

У меня 2 beanstalkc приемника смотрят одну и ту же трубку "tubename".

Я бы хотел, чтобы один beanstalkc приемник имел приоритет над другим. Чтобы достичь этого, я хотел бы сказать получателю с самым низким приоритетом beanstalkc, чтобы он дождался, пока задача не будет старше X секунд, прежде чем резервировать их.

Я нашел "reserve-with-timeout", но Я не совсем понимаю это, и мне не удалось заставить его успешно работать для моего варианта использования.

class MyBeanstalkReceiver():
    def __init__(self, host=beanstalkc.DEFAULT_HOST, port=beanstalkc.DEFAULT_PORT,
                 tube="default", timeout=1):
        self.tube = tube
        self.host = host
        self.port = port
        self.timeout = timeout

    def run(self):
        while True:
            self.run_once()

    def run_once(self):
        job = self._get_task()

        try:
            body = job.body
            data = json.loads(body)
            self.job(data)
        except Exception as e:
            job.delete()

    def job(self, data):
        print(data)

    def beanstalk(self):
        beanstalk = beanstalkc.Connection(host=self.host, port=self.port)
        beanstalk.use(self.tube)
        beanstalk.watch(self.tube)
        return beanstalk

    def _get_task(self):
        return self.beanstalk().reserve(self.timeout)

И мои 2 beanstalkc приемники:

# receiver 1
w = MyBeanstalkReceiver(hosts=["localhost:14711"], tube="tubename", timeout=1)
w.run()
# receiver 2
w = MyBeanstalkReceiver(hosts=["localhost:14711"], tube="tubename", timeout=10000)
w.run()

Между 2 приемника, с таймаутом 1 и 10000, ничего не меняется, когда я отправляю задачи по трубке: оба в конечном итоге управляют одинаковым количеством задач, помещенных в трубку "tubename".

Любая идея о том, как действовать сделать "получатель 1" приоритетнее "получателя 2"?

Ответы [ 2 ]

0 голосов
/ 19 августа 2020

Beanstalkd не делает различий между приоритетами клиентов и получателей.

0 голосов
/ 06 августа 2020

Таймаут в reserve - это время, в течение которого клиент будет ждать перед возвратом без задания.

Возможно, вы ищете put (с задержкой) , где задание не освобождается до тех пор, пока он не будет находиться в очереди не менее n секунд.

Также существует приоритет для каждого задания. Если получатель мог видеть их обоих одновременно, он вернет любые задания с более высоким приоритетом (ie: ближе к 0), чем с более низким приоритетом (с большим числом).

...