Redis
 sql >> база данни >  >> NoSQL >> Redis

Използване на Celery за реално време, синхронни външни заявки за API с Gevent

Ще се опитам да отговоря на възможно най-много въпроси.

Може ли това (и трябва ли) да се направи с целина?

Да, можете

Използвам django. Трябва ли да се опитам да използвам django-celery вместо обикновена целина?

Django има добра поддръжка за целина и би улеснил живота много по време на разработка

Всяка една от тези задачи може да породи други задачи - като регистриране на случилото се току-що или други видове разклонения. Възможно ли е това?

Можете да стартирате подзадачи от задача с ignore_result =true само за странични ефекти

Възможно ли е задачите да връщат данните, които получават – т.е. потенциално Kb данни чрез celery (в този случай redis е основен) или трябва да запишат в DB и просто да предават указатели към тези данни?

Бих предложил да поставите резултатите в db и след това предаването на id наоколо ще направи вашия брокер и работници щастливи. По-малко пренос на данни/пикиране и др.

Всяка задача е предимно I/O обвързана и първоначално просто щеше да използва gevent от уеб нишката, за да разклони заявките и да пропусне целия дизайн на опашката, но се оказа, че ще бъде използван повторно за различен компонент. Опитът да запазите цялото пътуване през Qs в реално време вероятно ще изисква много работници, които да се уверят, че опашката е предимно празна. Или е така? Ще помогне ли стартирането на gevent workerpool с това?

Тъй като процесът е свързан с io, тогава gevent определено ще помогне тук. Въпреки това, колко трябва да бъде паралелността за gevent pool'd worker, също търся отговор.

Трябва ли да напиша специфични за gevent задачи или използването на gevent pool ще се справи автоматично с мрежовия IO?

Gevent прави кръпките на маймуните автоматично, когато го използвате в басейн. Но библиотеките, които използвате, трябва да работят добре с gevent. В противен случай, ако анализирате някои данни с simplejson (което е написано в c), това ще блокира други зелени кодове на gevent.

Възможно ли е да се даде приоритет на определени задачи?

Не можете да зададете конкретни приоритети на определени задачи, а да ги насочите към различна опашка и след това тези опашки да бъдат прослушвани от различен брой работници. Колкото повече работници за конкретна опашка, толкова по-висок ще бъде приоритетът на тези задачи в тази опашка.

Какво ще кажете за поддържането им в ред?

Веригата е един от начините за поддържане на реда. Акордът е добър начин да обобщите. Целина се грижи за това, така че не е нужно да се притеснявате за това. Дори когато използвате gevent pool, в крайна сметка би било възможно да се разсъждава за реда на изпълнение на задачите.

Трябва ли да пропусна целина и просто да използвам комбу?

Можете, ако вашият случай на употреба няма да се промени в нещо по-сложно с течение на времето, а също и ако желаете сами да управлявате процесите си чрез celeryd + supervisord. Освен това, ако не ви е грижа за мониторинга на задачите, който идва с инструменти като целина, цвете и др.

Изглежда, че целината е насочена повече към „задачи“, които могат да бъдат отложени и не са чувствителни към времето.

Целина поддържа и планирани задачи. Ако това имахте предвид с това твърдение.

Луд ли съм, че се опитвам да поддържам това реално време?

не мисля така. Докато вашите потребители са достатъчно бързи, това ще бъде толкова добро, колкото в реално време.

Какви други технологии трябва да разгледам?

Що се отнася до целината, трябва да изберете разумно съхранение на резултатите. Моето предложение би било да се използва касандра. Той е добър за данни в реално време (както за писане, така и за заявка). Можете също да използвате redis или mongodb. Те идват със собствен набор от проблеми като съхранение на резултати. Но тогава малко настройване на конфигурацията може да извърви дълъг път.

Ако имате предвид нещо напълно различно от celery, тогава можете да разгледате asyncio (python3.5) и zeromq за постигане на същото. Все пак не мога да коментирам повече.




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Защо да използвате Redis вместо MongoDb за кеширане?

  2. Най-добрият модел за работа с асинхронен цикъл в Node.js

  3. Можете ли да се свържете с Amazon ElastiСache Redis извън Amazon?

  4. Използване на StackExchange.Redis в ASP.NET Core контролер

  5. Персонализираната среда на Rails Resque.enqueue не създава работни места