SlideShare a Scribd company logo
Асинхронный RPC с
помощью Gevent и RabbitMQ
Александр Мокров
О чем доклад
Некоторые ограничения Celery
Как их обойти
Gevent
RabbitMQ (некоторые особенности)
Будет предложена модель асинхронного RPC
Пример построения приложения на Celery workflow
get flour
bake pie
get meat
seal pie
create
dough
order pie
get milk
get aggs
...
entry point
2
entry point
1
entry point
3 service n
app
service 2
service 1
sommelier
winery
сhateau
Service of
degustation 3
app
Service of
degustation 2
Service of
degustation 1
Дегустация вин с
gevent и RabbitMQ
entry task
service task 1
DB
callback task 1
service task n
callback task n
Что хотелось бы получить
entry task
service task 1
service task 2
service task n
long task services
time
Celery AsyncResult
async_result = task.apply_async()
print(async_result.status)
False
result = async_result.wait()
long task
service
task
persistant
queue
exclusive
queue
reply_to=amq.gen-E6.
correlation_id
Request
correlation_id
Response reply_to=amq.gen-E6...
RabbitMQ RPC
greenlet
greenlet
long task
service
response
listener
service service service
reply_to
exclusive
queue
services queues
Workers
● solo
● prefork
● eventlet
● gevent
Gevent
gevent is a concurrency library based around libev. It provides a clean API for a
variety of concurrency and network related tasks.
Greenlet
The primary pattern used in gevent is the Greenlet, a lightweight coroutine
provided to Python as a C extension module. Greenlets all run inside of the OS
process for the main program but are scheduled cooperatively.
Only one greenlet is ever running at any given time.
Spin-off of Stackless, a version of CPython that supports micro-threads called
“tasklets”. Tasklets run pseudo-concurrently (typically in a single or a few OS-level
threads) and are synchronized with data exchanges on “channels”.
Its coroutine
Event loop
def foo():
print('Running in foo')
gevent.sleep(0)
print('Explicit context switch to
foo')
def bar():
print('Explicit context to bar')
gevent.sleep()
print('Implicit context switch to
bar')
gevent.joinall([
gevent.spawn(foo),
gevent.spawn(bar),
])
Running in foo
Explicit context to bar
Explicit context switch to foo
Implicit context switch to bar
def task(pid):
gevent.sleep(random.randint(0,2)*0.001)
print('Task %s done' % pid)
def synchronous():
for i in range(1, 8):
task(i)
def asynchronous():
threads = [gevent.spawn(task, i) for i
in range(10)]
gevent.joinall(threads)
Synchronous:
Task 1 done
Task 2 done
Task 3 done
Task 4 done
Task 5 done
Task 6 done
Task 7 done
Asynchronous:
Task 1 done
Task 5 done
Task 6 done
Task 2 done
Task 4 done
Task 7 done
Task 0 done
Task 3 done
def echo(i):
time.sleep(0.001)
return i
# Non Deterministic Process Pool
from multiprocessing.pool import Pool
p = Pool(10)
run1 = [a for a in p.imap_unordered(echo, xrange(10))]
run2 = [a for a in p.imap_unordered(echo, xrange(10))]
run3 = [a for a in p.imap_unordered(echo, xrange(10))]
run4 = [a for a in p.imap_unordered(echo, xrange(10))]
print(run1 == run2 == run3 == run4)
False
# Deterministic Gevent Pool
from gevent.pool import Pool
p = Pool(10)
run1 = [a for a in p.imap_unordered(echo, xrange(10))]
run2 = [a for a in p.imap_unordered(echo, xrange(10))]
run3 = [a for a in p.imap_unordered(echo, xrange(10))]
run4 = [a for a in p.imap_unordered(echo, xrange(10))]
print(run1 == run2 == run3 == run4)
True
Spawning Greenlets
from gevent import Greenlet
thread1 = Greenlet.spawn(foo, "message", 1)
thread2 = gevent.spawn(foo, "message", 2)
thread3 = gevent.spawn(lambda x: (x+1), 2)
threads = [thread1, thread2, thread3]
# Block until all threads complete.
gevent.joinall(threads)
class MyGreenlet(Greenlet):
def __init__(self, message, n):
Greenlet.__init__(self)
self.message = message
self.n = n
def _run(self):
print(self.message)
gevent.sleep(self.n)
g = MyGreenlet("Hi there!", 3)
g.start()
g.join()
Greenlet State
started -- Boolean, indicates whether the Greenlet has been started
ready() -- Boolean, indicates whether the Greenlet has halted
successful() -- Boolean, indicates whether the Greenlet has halted and not thrown
an exception
value -- arbitrary, the value returned by the Greenlet
exception -- exception, uncaught exception instance thrown inside the greenlet
greenlet
greenlet
long task
service
response
listener
subscribe(task_id)
Timeouts
from gevent import Timeout
seconds = 10
timeout = Timeout(seconds)
timeout.start()
def wait():
gevent.sleep(10)
try:
gevent.spawn(wait).join()
except Timeout:
print('Could not complete')
time_to_wait = 5 # seconds
class TooLong(Exception):
pass
with Timeout(time_to_wait, TooLong):
gevent.sleep(10)
class Queue(maxsize=None, items=None)
empty()
full()
get(block=True, timeout=None)
get_nowait()
next()
peek(block=True, timeout=None)
peek_nowait()
put(item, block=True, timeout=None)
put_nowait(item)
qsize()
greenlet
greenlet
greenlet
service
results
dispatcher
gevent.queues
task_id
reply_to, results_queue
Events
Groups and
Pools
Locks and
Semaphores
Subprocess
Thread
Locals
Actors
Gevent rabbit rpc
Monkey patching
guerrilla
patch
gorilla
patch
monkey
patch
import socket
print(socket.socket)
from gevent import monkey
monkey.patch_socket()
print("After monkey patch")
print(socket.socket)
import select
print(select.select)
monkey.patch_select()
print("After monkey patch")
print(select.select)
<class 'socket.socket'>
After monkey patch
<class 'gevent._socket3.socket'>
<built-in function select>
After monkey patch
<function select at 0x7ff7e111c378>
Stack layout for a greenlet
| ^^^ |
| older data |
| |
stack_stop . |_______________|
. | |
. | greenlet data |
. | in stack |
. * |_______________| . . _____________ stack_copy + stack_saved
. | | | |
. | data | |greenlet data|
. | unrelated | | saved |
. | to | | in heap |
stack_start . | this | . . |_____________| stack_copy
| greenlet |
| |
| newer data |
| vvv |
greenlet
greenlet
greenlet
service
results
dispatcher
service service service
reply_to
exclusive
queue
services queues
subscribe
gevent.queues
Service Result Dispatcher
greenlet
greenlet
greenlet
service
results
dispatcher
reply_to
exclusive
queue
reply_to, results_queue
gevent.queues
task_id
task_id, reply_to
class ServiceResultsDispatcher(Greenlet):
def __init__(self):
…
self.reply_to = None
Greenlet.__init__(self)
def create_connection(self):
...
result = self.channel.queue_declare(exclusive=True)
self.reply_to = result.method.queue
def subscribe(self, task_id):
service_results_queue = gevent.queue.Queue()
self.service_results[task_id] = service_results_queue
return service_results, self.reply_to
def unsubscribe(self, task_id):
self.service_results.pop(task_id, None)
def _run(self):
while True:
try:
for method_frame, properties, body in self.channel.consume(self.reply_to,
no_ack=True):
if properties.correlation_id in self.tasks:
self.tasks[properties.correlation_id].put_nowait((method_frame,
properties, body))
except ...
Greenlet task
greenlet
greenlet
greenlet
service
results
dispatcher
services queues
subscribe
gevent.queues
self.results_queue, self.reply_to = self.service_publisher.subscribe(self.task_id)
self.channel.basic_publish(exchange='',
routing_key=service_queue,
properties=BasicProperties(
reply_to=self.reply_to,
correlation_id=self.task_id
),
body=request)
try:
method_frame, properties, body =
self.results_queue.get(block=True, timeout=self.timeout)
except Empty:
logger.info('timeout')
break
else:
logger.info('body = {}'.format(body))
Services
response = channel.basic_publish(
exchange='',
routing_key=props.reply_to,
properties=BasicProperties(correlation_id=request.task_id),
body=response
)
Альтернативы?
Почему gevent?
1. Встроенная поддержка в Celery (малыми силами)
2. Хотелось рассмотреть в докладе именно gevent. Ничто не мешает
переделать, к примеру, на asyncio.
Вывод
Ссылки
http://www.gevent.org
http://sdiehl.github.io/gevent-tutorial/
https://github.com/python-greenlet/greenlet
https://www.rabbitmq.com/
http://www.celeryproject.org/
Спасибо за внимание!

More Related Content

What's hot

How to ride a whale
How to ride a whaleHow to ride a whale
How to ride a whale
Vincent Vermersh
 
Node.js API 서버 성능 개선기
Node.js API 서버 성능 개선기Node.js API 서버 성능 개선기
Node.js API 서버 성능 개선기
JeongHun Byeon
 
General Functions
General FunctionsGeneral Functions
General Functions
BabuDevanandam
 
Roll Your Own API Management Platform with nginx and Lua
Roll Your Own API Management Platform with nginx and LuaRoll Your Own API Management Platform with nginx and Lua
Roll Your Own API Management Platform with nginx and Lua
Jon Moore
 
Redis & ZeroMQ: How to scale your application
Redis & ZeroMQ: How to scale your applicationRedis & ZeroMQ: How to scale your application
Redis & ZeroMQ: How to scale your application
rjsmelo
 
Ricon/West 2013: Adventures with Riak Pipe
Ricon/West 2013: Adventures with Riak PipeRicon/West 2013: Adventures with Riak Pipe
Ricon/West 2013: Adventures with Riak Pipe
Susan Potter
 
Programming with Python and PostgreSQL
Programming with Python and PostgreSQLProgramming with Python and PostgreSQL
Programming with Python and PostgreSQL
Peter Eisentraut
 
MongoDB Replication (Dwight Merriman)
MongoDB Replication (Dwight Merriman)MongoDB Replication (Dwight Merriman)
MongoDB Replication (Dwight Merriman)
MongoSF
 
Psycopg2 - Connect to PostgreSQL using Python Script
Psycopg2 - Connect to PostgreSQL using Python ScriptPsycopg2 - Connect to PostgreSQL using Python Script
Psycopg2 - Connect to PostgreSQL using Python Script
Survey Department
 
Feb14 successful development
Feb14 successful developmentFeb14 successful development
Feb14 successful development
Connor McDonald
 
Learning Dtrace
Learning DtraceLearning Dtrace
Learning Dtrace
JeongHun Byeon
 
DevOps with Fabric
DevOps with FabricDevOps with Fabric
DevOps with Fabric
Simone Federici
 
Новый InterSystems: open-source, митапы, хакатоны
Новый InterSystems: open-source, митапы, хакатоныНовый InterSystems: open-source, митапы, хакатоны
Новый InterSystems: open-source, митапы, хакатоны
Timur Safin
 
Understanding greenlet
Understanding greenletUnderstanding greenlet
Understanding greenlet
Saúl Ibarra Corretgé
 
ql.io: Consuming HTTP at Scale
ql.io: Consuming HTTP at Scale ql.io: Consuming HTTP at Scale
ql.io: Consuming HTTP at Scale
Subbu Allamaraju
 
Node.js - Best practices
Node.js  - Best practicesNode.js  - Best practices
Node.js - Best practices
Felix Geisendörfer
 
Building and Incredible Machine with Pipelines and Generators in PHP (IPC Ber...
Building and Incredible Machine with Pipelines and Generators in PHP (IPC Ber...Building and Incredible Machine with Pipelines and Generators in PHP (IPC Ber...
Building and Incredible Machine with Pipelines and Generators in PHP (IPC Ber...
dantleech
 
Redis as a message queue
Redis as a message queueRedis as a message queue
Redis as a message queue
Brandon Lamb
 
Ubic
UbicUbic
Jersey framework
Jersey frameworkJersey framework
Jersey framework
knight1128
 

What's hot (20)

How to ride a whale
How to ride a whaleHow to ride a whale
How to ride a whale
 
Node.js API 서버 성능 개선기
Node.js API 서버 성능 개선기Node.js API 서버 성능 개선기
Node.js API 서버 성능 개선기
 
General Functions
General FunctionsGeneral Functions
General Functions
 
Roll Your Own API Management Platform with nginx and Lua
Roll Your Own API Management Platform with nginx and LuaRoll Your Own API Management Platform with nginx and Lua
Roll Your Own API Management Platform with nginx and Lua
 
Redis & ZeroMQ: How to scale your application
Redis & ZeroMQ: How to scale your applicationRedis & ZeroMQ: How to scale your application
Redis & ZeroMQ: How to scale your application
 
Ricon/West 2013: Adventures with Riak Pipe
Ricon/West 2013: Adventures with Riak PipeRicon/West 2013: Adventures with Riak Pipe
Ricon/West 2013: Adventures with Riak Pipe
 
Programming with Python and PostgreSQL
Programming with Python and PostgreSQLProgramming with Python and PostgreSQL
Programming with Python and PostgreSQL
 
MongoDB Replication (Dwight Merriman)
MongoDB Replication (Dwight Merriman)MongoDB Replication (Dwight Merriman)
MongoDB Replication (Dwight Merriman)
 
Psycopg2 - Connect to PostgreSQL using Python Script
Psycopg2 - Connect to PostgreSQL using Python ScriptPsycopg2 - Connect to PostgreSQL using Python Script
Psycopg2 - Connect to PostgreSQL using Python Script
 
Feb14 successful development
Feb14 successful developmentFeb14 successful development
Feb14 successful development
 
Learning Dtrace
Learning DtraceLearning Dtrace
Learning Dtrace
 
DevOps with Fabric
DevOps with FabricDevOps with Fabric
DevOps with Fabric
 
Новый InterSystems: open-source, митапы, хакатоны
Новый InterSystems: open-source, митапы, хакатоныНовый InterSystems: open-source, митапы, хакатоны
Новый InterSystems: open-source, митапы, хакатоны
 
Understanding greenlet
Understanding greenletUnderstanding greenlet
Understanding greenlet
 
ql.io: Consuming HTTP at Scale
ql.io: Consuming HTTP at Scale ql.io: Consuming HTTP at Scale
ql.io: Consuming HTTP at Scale
 
Node.js - Best practices
Node.js  - Best practicesNode.js  - Best practices
Node.js - Best practices
 
Building and Incredible Machine with Pipelines and Generators in PHP (IPC Ber...
Building and Incredible Machine with Pipelines and Generators in PHP (IPC Ber...Building and Incredible Machine with Pipelines and Generators in PHP (IPC Ber...
Building and Incredible Machine with Pipelines and Generators in PHP (IPC Ber...
 
Redis as a message queue
Redis as a message queueRedis as a message queue
Redis as a message queue
 
Ubic
UbicUbic
Ubic
 
Jersey framework
Jersey frameworkJersey framework
Jersey framework
 

Similar to Gevent rabbit rpc

Gevent be or not to be
Gevent be or not to beGevent be or not to be
Gevent be or not to be
Aleksandr Mokrov
 
«Gevent — быть или не быть?» Александр Мокров, Positive Technologies
«Gevent — быть или не быть?» Александр Мокров, Positive Technologies«Gevent — быть или не быть?» Александр Мокров, Positive Technologies
«Gevent — быть или не быть?» Александр Мокров, Positive Technologies
it-people
 
GenServer in Action – Yurii Bodarev
GenServer in Action – Yurii Bodarev   GenServer in Action – Yurii Bodarev
GenServer in Action – Yurii Bodarev
Elixir Club
 
GenServer in action
GenServer in actionGenServer in action
GenServer in action
Yurii Bodarev
 
Gevent what's the point
Gevent what's the pointGevent what's the point
Gevent what's the point
seanmcq
 
The journey of asyncio adoption in instagram
The journey of asyncio adoption in instagramThe journey of asyncio adoption in instagram
The journey of asyncio adoption in instagram
Jimmy Lai
 
A deep dive into PEP-3156 and the new asyncio module
A deep dive into PEP-3156 and the new asyncio moduleA deep dive into PEP-3156 and the new asyncio module
A deep dive into PEP-3156 and the new asyncio module
Saúl Ibarra Corretgé
 
Job Queue in Golang
Job Queue in GolangJob Queue in Golang
Job Queue in Golang
Bo-Yi Wu
 
Introducing to Asynchronous Programming
Introducing to Asynchronous  ProgrammingIntroducing to Asynchronous  Programming
Introducing to Asynchronous Programming
Александр Федоров
 
Go Concurrency Patterns
Go Concurrency PatternsGo Concurrency Patterns
Go Concurrency Patterns
ElifTech
 
Giorgio zoppi cpp11concurrency
Giorgio zoppi cpp11concurrencyGiorgio zoppi cpp11concurrency
Giorgio zoppi cpp11concurrency
Giorgio Zoppi
 
Threads, Queues, and More: Async Programming in iOS
Threads, Queues, and More: Async Programming in iOSThreads, Queues, and More: Async Programming in iOS
Threads, Queues, and More: Async Programming in iOS
TechWell
 
Scaling django
Scaling djangoScaling django
Scaling django
Md. Ahsanuzzaman Khan
 
Python profiling
Python profilingPython profiling
Python profiling
dreampuf
 
The Ring programming language version 1.10 book - Part 94 of 212
The Ring programming language version 1.10 book - Part 94 of 212The Ring programming language version 1.10 book - Part 94 of 212
The Ring programming language version 1.10 book - Part 94 of 212
Mahmoud Samir Fayed
 
Current State of Coroutines
Current State of CoroutinesCurrent State of Coroutines
Current State of Coroutines
Guido Pio Mariotti
 
Asynchronous web apps with the Play Framework 2.0
Asynchronous web apps with the Play Framework 2.0Asynchronous web apps with the Play Framework 2.0
Asynchronous web apps with the Play Framework 2.0
Oscar Renalias
 
用 Go 語言打造多台機器 Scale 架構
用 Go 語言打造多台機器 Scale 架構用 Go 語言打造多台機器 Scale 架構
用 Go 語言打造多台機器 Scale 架構
Bo-Yi Wu
 
Jdk 7 4-forkjoin
Jdk 7 4-forkjoinJdk 7 4-forkjoin
Jdk 7 4-forkjoin
knight1128
 
Advanced patterns in asynchronous programming
Advanced patterns in asynchronous programmingAdvanced patterns in asynchronous programming
Advanced patterns in asynchronous programming
Michael Arenzon
 

Similar to Gevent rabbit rpc (20)

Gevent be or not to be
Gevent be or not to beGevent be or not to be
Gevent be or not to be
 
«Gevent — быть или не быть?» Александр Мокров, Positive Technologies
«Gevent — быть или не быть?» Александр Мокров, Positive Technologies«Gevent — быть или не быть?» Александр Мокров, Positive Technologies
«Gevent — быть или не быть?» Александр Мокров, Positive Technologies
 
GenServer in Action – Yurii Bodarev
GenServer in Action – Yurii Bodarev   GenServer in Action – Yurii Bodarev
GenServer in Action – Yurii Bodarev
 
GenServer in action
GenServer in actionGenServer in action
GenServer in action
 
Gevent what's the point
Gevent what's the pointGevent what's the point
Gevent what's the point
 
The journey of asyncio adoption in instagram
The journey of asyncio adoption in instagramThe journey of asyncio adoption in instagram
The journey of asyncio adoption in instagram
 
A deep dive into PEP-3156 and the new asyncio module
A deep dive into PEP-3156 and the new asyncio moduleA deep dive into PEP-3156 and the new asyncio module
A deep dive into PEP-3156 and the new asyncio module
 
Job Queue in Golang
Job Queue in GolangJob Queue in Golang
Job Queue in Golang
 
Introducing to Asynchronous Programming
Introducing to Asynchronous  ProgrammingIntroducing to Asynchronous  Programming
Introducing to Asynchronous Programming
 
Go Concurrency Patterns
Go Concurrency PatternsGo Concurrency Patterns
Go Concurrency Patterns
 
Giorgio zoppi cpp11concurrency
Giorgio zoppi cpp11concurrencyGiorgio zoppi cpp11concurrency
Giorgio zoppi cpp11concurrency
 
Threads, Queues, and More: Async Programming in iOS
Threads, Queues, and More: Async Programming in iOSThreads, Queues, and More: Async Programming in iOS
Threads, Queues, and More: Async Programming in iOS
 
Scaling django
Scaling djangoScaling django
Scaling django
 
Python profiling
Python profilingPython profiling
Python profiling
 
The Ring programming language version 1.10 book - Part 94 of 212
The Ring programming language version 1.10 book - Part 94 of 212The Ring programming language version 1.10 book - Part 94 of 212
The Ring programming language version 1.10 book - Part 94 of 212
 
Current State of Coroutines
Current State of CoroutinesCurrent State of Coroutines
Current State of Coroutines
 
Asynchronous web apps with the Play Framework 2.0
Asynchronous web apps with the Play Framework 2.0Asynchronous web apps with the Play Framework 2.0
Asynchronous web apps with the Play Framework 2.0
 
用 Go 語言打造多台機器 Scale 架構
用 Go 語言打造多台機器 Scale 架構用 Go 語言打造多台機器 Scale 架構
用 Go 語言打造多台機器 Scale 架構
 
Jdk 7 4-forkjoin
Jdk 7 4-forkjoinJdk 7 4-forkjoin
Jdk 7 4-forkjoin
 
Advanced patterns in asynchronous programming
Advanced patterns in asynchronous programmingAdvanced patterns in asynchronous programming
Advanced patterns in asynchronous programming
 

Recently uploaded

06. Ruby Array & Hash - Ruby Core Teaching
06. Ruby Array & Hash - Ruby Core Teaching06. Ruby Array & Hash - Ruby Core Teaching
06. Ruby Array & Hash - Ruby Core Teaching
quanhoangd129
 
How to Secure Your Kubernetes Software Supply Chain at Scale
How to Secure Your Kubernetes Software Supply Chain at ScaleHow to Secure Your Kubernetes Software Supply Chain at Scale
How to Secure Your Kubernetes Software Supply Chain at Scale
Anchore
 
Russian Girls Call Mumbai 🛵🚡9833363713 💃 Choose Best And Top Girl Service And...
Russian Girls Call Mumbai 🛵🚡9833363713 💃 Choose Best And Top Girl Service And...Russian Girls Call Mumbai 🛵🚡9833363713 💃 Choose Best And Top Girl Service And...
Russian Girls Call Mumbai 🛵🚡9833363713 💃 Choose Best And Top Girl Service And...
dream girl
 
PathSpotter: Exploring Tested Paths to Discover Missing Tests (FSE 2024)
PathSpotter: Exploring Tested Paths to Discover Missing Tests (FSE 2024)PathSpotter: Exploring Tested Paths to Discover Missing Tests (FSE 2024)
PathSpotter: Exploring Tested Paths to Discover Missing Tests (FSE 2024)
andrehoraa
 
Private Girls Call Navi Mumbai 🛵🚡9820252231 💃 Choose Best And Top Girl Servic...
Private Girls Call Navi Mumbai 🛵🚡9820252231 💃 Choose Best And Top Girl Servic...Private Girls Call Navi Mumbai 🛵🚡9820252231 💃 Choose Best And Top Girl Servic...
Private Girls Call Navi Mumbai 🛵🚡9820252231 💃 Choose Best And Top Girl Servic...
902basic
 
Authentication Review-June -2024 AP & TS.pptx
Authentication Review-June -2024 AP & TS.pptxAuthentication Review-June -2024 AP & TS.pptx
Authentication Review-June -2024 AP & TS.pptx
DEMONDUOS
 
Unlocking value with event-driven architecture by Confluent
Unlocking value with event-driven architecture by ConfluentUnlocking value with event-driven architecture by Confluent
Unlocking value with event-driven architecture by Confluent
confluent
 
DSD-INT 2024 Rainfall nowcasting – now and then - Uijlenhoet
DSD-INT 2024 Rainfall nowcasting – now and then - UijlenhoetDSD-INT 2024 Rainfall nowcasting – now and then - Uijlenhoet
DSD-INT 2024 Rainfall nowcasting – now and then - Uijlenhoet
Deltares
 
Predicting Test Results without Execution (FSE 2024)
Predicting Test Results without Execution (FSE 2024)Predicting Test Results without Execution (FSE 2024)
Predicting Test Results without Execution (FSE 2024)
andrehoraa
 
ERP Software Solutions Provider in Coimbatore
ERP Software Solutions Provider in CoimbatoreERP Software Solutions Provider in Coimbatore
ERP Software Solutions Provider in Coimbatore
Nextskill Technologies
 
Mumbai Girls Call Mumbai 🎈🔥9930687706 🔥💋🎈 Provide Best And Top Girl Service A...
Mumbai Girls Call Mumbai 🎈🔥9930687706 🔥💋🎈 Provide Best And Top Girl Service A...Mumbai Girls Call Mumbai 🎈🔥9930687706 🔥💋🎈 Provide Best And Top Girl Service A...
Mumbai Girls Call Mumbai 🎈🔥9930687706 🔥💋🎈 Provide Best And Top Girl Service A...
3610stuck
 
TEQnation 2024: Sustainable Software: May the Green Code Be with You
TEQnation 2024: Sustainable Software: May the Green Code Be with YouTEQnation 2024: Sustainable Software: May the Green Code Be with You
TEQnation 2024: Sustainable Software: May the Green Code Be with You
marcofolio
 
Verified Girls Call Mumbai 👀 9820252231 👀 Cash Payment With Room DeliveryDeli...
Verified Girls Call Mumbai 👀 9820252231 👀 Cash Payment With Room DeliveryDeli...Verified Girls Call Mumbai 👀 9820252231 👀 Cash Payment With Room DeliveryDeli...
Verified Girls Call Mumbai 👀 9820252231 👀 Cash Payment With Room DeliveryDeli...
87tomato
 
Celebrity Girls Call Mumbai 🛵🚡9910780858 💃 Choose Best And Top Girl Service A...
Celebrity Girls Call Mumbai 🛵🚡9910780858 💃 Choose Best And Top Girl Service A...Celebrity Girls Call Mumbai 🛵🚡9910780858 💃 Choose Best And Top Girl Service A...
Celebrity Girls Call Mumbai 🛵🚡9910780858 💃 Choose Best And Top Girl Service A...
norina2645
 
01. Ruby Introduction - Ruby Core Teaching
01. Ruby Introduction - Ruby Core Teaching01. Ruby Introduction - Ruby Core Teaching
01. Ruby Introduction - Ruby Core Teaching
quanhoangd129
 
Old Tools, New Tricks: Unleashing the Power of Time-Tested Testing Tools
Old Tools, New Tricks: Unleashing the Power of Time-Tested Testing ToolsOld Tools, New Tricks: Unleashing the Power of Time-Tested Testing Tools
Old Tools, New Tricks: Unleashing the Power of Time-Tested Testing Tools
Benjamin Bischoff
 
B.Sc. Computer Science Department PPT 2024
B.Sc. Computer Science Department PPT 2024B.Sc. Computer Science Department PPT 2024
B.Sc. Computer Science Department PPT 2024
vmsdeptcom
 
Celebrity Girls Call Mumbai 9920725232 Unlimited Short Providing Girls Servic...
Celebrity Girls Call Mumbai 9920725232 Unlimited Short Providing Girls Servic...Celebrity Girls Call Mumbai 9920725232 Unlimited Short Providing Girls Servic...
Celebrity Girls Call Mumbai 9920725232 Unlimited Short Providing Girls Servic...
45unexpected
 
Russian Girls Call Mumbai 🎈🔥9930687706 🔥💋🎈 Provide Best And Top Girl Service ...
Russian Girls Call Mumbai 🎈🔥9930687706 🔥💋🎈 Provide Best And Top Girl Service ...Russian Girls Call Mumbai 🎈🔥9930687706 🔥💋🎈 Provide Best And Top Girl Service ...
Russian Girls Call Mumbai 🎈🔥9930687706 🔥💋🎈 Provide Best And Top Girl Service ...
shanihomely
 
🚂🚘 Premium Girls Call Ranchi 🛵🚡000XX00000 💃 Choose Best And Top Girl Service...
🚂🚘 Premium Girls Call Ranchi  🛵🚡000XX00000 💃 Choose Best And Top Girl Service...🚂🚘 Premium Girls Call Ranchi  🛵🚡000XX00000 💃 Choose Best And Top Girl Service...
🚂🚘 Premium Girls Call Ranchi 🛵🚡000XX00000 💃 Choose Best And Top Girl Service...
bahubalikumar09988
 

Recently uploaded (20)

06. Ruby Array & Hash - Ruby Core Teaching
06. Ruby Array & Hash - Ruby Core Teaching06. Ruby Array & Hash - Ruby Core Teaching
06. Ruby Array & Hash - Ruby Core Teaching
 
How to Secure Your Kubernetes Software Supply Chain at Scale
How to Secure Your Kubernetes Software Supply Chain at ScaleHow to Secure Your Kubernetes Software Supply Chain at Scale
How to Secure Your Kubernetes Software Supply Chain at Scale
 
Russian Girls Call Mumbai 🛵🚡9833363713 💃 Choose Best And Top Girl Service And...
Russian Girls Call Mumbai 🛵🚡9833363713 💃 Choose Best And Top Girl Service And...Russian Girls Call Mumbai 🛵🚡9833363713 💃 Choose Best And Top Girl Service And...
Russian Girls Call Mumbai 🛵🚡9833363713 💃 Choose Best And Top Girl Service And...
 
PathSpotter: Exploring Tested Paths to Discover Missing Tests (FSE 2024)
PathSpotter: Exploring Tested Paths to Discover Missing Tests (FSE 2024)PathSpotter: Exploring Tested Paths to Discover Missing Tests (FSE 2024)
PathSpotter: Exploring Tested Paths to Discover Missing Tests (FSE 2024)
 
Private Girls Call Navi Mumbai 🛵🚡9820252231 💃 Choose Best And Top Girl Servic...
Private Girls Call Navi Mumbai 🛵🚡9820252231 💃 Choose Best And Top Girl Servic...Private Girls Call Navi Mumbai 🛵🚡9820252231 💃 Choose Best And Top Girl Servic...
Private Girls Call Navi Mumbai 🛵🚡9820252231 💃 Choose Best And Top Girl Servic...
 
Authentication Review-June -2024 AP & TS.pptx
Authentication Review-June -2024 AP & TS.pptxAuthentication Review-June -2024 AP & TS.pptx
Authentication Review-June -2024 AP & TS.pptx
 
Unlocking value with event-driven architecture by Confluent
Unlocking value with event-driven architecture by ConfluentUnlocking value with event-driven architecture by Confluent
Unlocking value with event-driven architecture by Confluent
 
DSD-INT 2024 Rainfall nowcasting – now and then - Uijlenhoet
DSD-INT 2024 Rainfall nowcasting – now and then - UijlenhoetDSD-INT 2024 Rainfall nowcasting – now and then - Uijlenhoet
DSD-INT 2024 Rainfall nowcasting – now and then - Uijlenhoet
 
Predicting Test Results without Execution (FSE 2024)
Predicting Test Results without Execution (FSE 2024)Predicting Test Results without Execution (FSE 2024)
Predicting Test Results without Execution (FSE 2024)
 
ERP Software Solutions Provider in Coimbatore
ERP Software Solutions Provider in CoimbatoreERP Software Solutions Provider in Coimbatore
ERP Software Solutions Provider in Coimbatore
 
Mumbai Girls Call Mumbai 🎈🔥9930687706 🔥💋🎈 Provide Best And Top Girl Service A...
Mumbai Girls Call Mumbai 🎈🔥9930687706 🔥💋🎈 Provide Best And Top Girl Service A...Mumbai Girls Call Mumbai 🎈🔥9930687706 🔥💋🎈 Provide Best And Top Girl Service A...
Mumbai Girls Call Mumbai 🎈🔥9930687706 🔥💋🎈 Provide Best And Top Girl Service A...
 
TEQnation 2024: Sustainable Software: May the Green Code Be with You
TEQnation 2024: Sustainable Software: May the Green Code Be with YouTEQnation 2024: Sustainable Software: May the Green Code Be with You
TEQnation 2024: Sustainable Software: May the Green Code Be with You
 
Verified Girls Call Mumbai 👀 9820252231 👀 Cash Payment With Room DeliveryDeli...
Verified Girls Call Mumbai 👀 9820252231 👀 Cash Payment With Room DeliveryDeli...Verified Girls Call Mumbai 👀 9820252231 👀 Cash Payment With Room DeliveryDeli...
Verified Girls Call Mumbai 👀 9820252231 👀 Cash Payment With Room DeliveryDeli...
 
Celebrity Girls Call Mumbai 🛵🚡9910780858 💃 Choose Best And Top Girl Service A...
Celebrity Girls Call Mumbai 🛵🚡9910780858 💃 Choose Best And Top Girl Service A...Celebrity Girls Call Mumbai 🛵🚡9910780858 💃 Choose Best And Top Girl Service A...
Celebrity Girls Call Mumbai 🛵🚡9910780858 💃 Choose Best And Top Girl Service A...
 
01. Ruby Introduction - Ruby Core Teaching
01. Ruby Introduction - Ruby Core Teaching01. Ruby Introduction - Ruby Core Teaching
01. Ruby Introduction - Ruby Core Teaching
 
Old Tools, New Tricks: Unleashing the Power of Time-Tested Testing Tools
Old Tools, New Tricks: Unleashing the Power of Time-Tested Testing ToolsOld Tools, New Tricks: Unleashing the Power of Time-Tested Testing Tools
Old Tools, New Tricks: Unleashing the Power of Time-Tested Testing Tools
 
B.Sc. Computer Science Department PPT 2024
B.Sc. Computer Science Department PPT 2024B.Sc. Computer Science Department PPT 2024
B.Sc. Computer Science Department PPT 2024
 
Celebrity Girls Call Mumbai 9920725232 Unlimited Short Providing Girls Servic...
Celebrity Girls Call Mumbai 9920725232 Unlimited Short Providing Girls Servic...Celebrity Girls Call Mumbai 9920725232 Unlimited Short Providing Girls Servic...
Celebrity Girls Call Mumbai 9920725232 Unlimited Short Providing Girls Servic...
 
Russian Girls Call Mumbai 🎈🔥9930687706 🔥💋🎈 Provide Best And Top Girl Service ...
Russian Girls Call Mumbai 🎈🔥9930687706 🔥💋🎈 Provide Best And Top Girl Service ...Russian Girls Call Mumbai 🎈🔥9930687706 🔥💋🎈 Provide Best And Top Girl Service ...
Russian Girls Call Mumbai 🎈🔥9930687706 🔥💋🎈 Provide Best And Top Girl Service ...
 
🚂🚘 Premium Girls Call Ranchi 🛵🚡000XX00000 💃 Choose Best And Top Girl Service...
🚂🚘 Premium Girls Call Ranchi  🛵🚡000XX00000 💃 Choose Best And Top Girl Service...🚂🚘 Premium Girls Call Ranchi  🛵🚡000XX00000 💃 Choose Best And Top Girl Service...
🚂🚘 Premium Girls Call Ranchi 🛵🚡000XX00000 💃 Choose Best And Top Girl Service...
 

Gevent rabbit rpc

Editor's Notes

  1. Сразу оговорюсь, что тут Celery можно вообще выкинуть из доклада и общая суть не изменится. Но хотелось бы показать, как нередко приходится сталкиваться с ограничениями существующих инструментов и возникает вопрос либо их (инструментов) расширения либо отказа в пользу чего-то более подходящего. В данном докладе я расскажу о некоторых трудностях, с которыми можно столкнуться при построении распределенной системы. Приведу приближенный проблемный пример и предложу свой вариант решения, который базируется на RabbitMQ и библиотеке gevent. Сделаю предварительно небольшой обзор библиотеки gevent и упомяну о некоторых особенностях которые понадобятся в предлагаемом решении.
  2. На экране приведен пример построения приложения базирующегося на Celery workflow. Я как-то уже приводил в прошлом докладе. Что она из себя представляет? Логика приложения разбита на отдельные задачи, которые выполняются либо последовательно, либо параллельно, выполнение одних задач зависит от других. В данном примере все выглядит хорошо и особых проблем нет. Но рассмотрим другой вариант.
  3. Когда на необходимо общаться с большим количество различных сервисов. Здесь есть у нас некие точки входа, от которых могут приходить какие-то задачи и результат их выполнения нужно возвращать. Иногда за ограниченное время. Есть некий аппликешен, логика работы которого может быть разбита на много задач, но это в данном случае не важно. И этому аппликейшену надо общаться с большим количеством как разных так и однотипных сервисов, результаты работы сервисов надо аккумулировать и формировать некий ответ для точек входа. В прошлом случае у меня был пример с пирожком, сейчас можно представить, что это система для дегустации вин.
  4. Вот у нас есть какие-то винные заводы, шато, который хотят получать от нас оценку их вина. А мы строим свою работу через общение с сервисами по дегустации. Это могут быть свои сервисы на которые мы можем влиять, а могут быть сервисы сторонние, партнерские, к которым надо приспосабливаться. Они все работают по разному, разное время, отдают разные оценки по разным параметрам. И иногда надо отвечать за ограниченное время и не обязательно по результатам работы всех сервисов. И желательно самим вносить минимальные задержки. Впрочем, некоторые виноделы могут и подождать когда наши эксперты опробуют их великолепные вина. Да и о чем собственно разговор, доклад должен был називаться так.
  5. Celery предлагает для подобного взаимодействия механизм callback’ов. Как это работает. В задаче, которую мы назначаем сервисам, укказываем какую задачу с каким набором аргументов надо выполнить при успешном завершении задачи, и аналогично при неуспешном. Т.е. в итоги получается цепочка из трех задач, последняя из которых зависит от успешности выполнения предыдущей. В правой части мы видим, что entry task создает n сервисных задач, в нашем варианте они выполняются на стороне сервисов, каждая из сервисных задач порождает callback task’и, которые уже выполняются нашим апп. И тут появляется проблемное место - каждая из call back задач не знает результаты выполнения предыдущих и есть ли результаты, а нам надо как-то аккумулировать результаты. И каждой задаче в итоге приходиться запрашивать результаты из некоего общего хранилища и писать туда же результаты своей работы. И еще быть готовыми в любой момент отдаь результат не дожидаясь дальнейших ответов от сервисов. И для этого нет нормального механизма.
  6. А что бы хотелось получить? Во-первых, хранить весь контекст управления в одном месте, во-вторых, контролировать выполнение и в любой момент быть готовыми завершить работу, либо отдать промежуточный вариант. Ну а в третьих, исключить необязательное постоянное взаимодействие с хранилищем и уменьшить латенси. В конце-концов система распределенная и запросы могут занимать значительное время между разными узлами. Т.е. неплохо, чтобы у нас была одна управляющая задача со контекстом выполнения, которая и будет получать результаты рпботы сервисов.
  7. Во временном разрезе это примерно будет выглядеть так.
  8. Что нам предоставляет Celery. С одной стороны есть AsyncResult, который позволяет получит статус задачи и собственно сам результат. Но нам надо дожидаться сразу много результатов, и как-то постоянно опрашивать статусы - не вариант. Т.е. тут надо что-то придумывать.
  9. С другой стороны кролик нам предлагает некую модель RPC. Клиентская часть, в данном случае наша длинная такса, при поднятии декларирует эксклюзивную очередь и в дальнейшем её слушает. Такая очередь будет создана со случайным именем и будет удалена после потери соединения с потребителем/клиентом. При отправке серверной части запроса необходима указать в параметре reply_to имя созданной эксклюзивной очереди и correlation_id для согласования запроса с ответом. Серверная часть выполняет задачу и отдает ответ в reply_to очередь с указанием свойствах ответа correlation_id. Клиент получает ответ и по correlation_id сопоставляет его с соответствующим запросом
  10. Такой подход вполне применим. У насть есть некоторое количество длинных задач, набор сервисов, которые слушают свои очереди. Но длинных тасок может быть одновременно много и потому для каждой из них создавать эксклюзивную очередь - плохой вариант. Потому логичнее выделить отдельную задачу, которая и будет получать ответы от сервисов и как-то отдавать их длинным задачам. Последние же должны как-то подписываться у этого слушателя на получение ответов и получать имя reply_to очереди. Последнее можно сделать реализовав интерфейс подписки, вопрос остается как получать ответы и как иметь одновременно большое количество задач, сотни, тысячи...
  11. Что может предложить celery? Есть несколько типов воркеров: solo - понятно, что не то, что нам требуется, и до кучи имеет дополнительные ограничения. Префорк - держать сотни и тем более тысячи процессов одновременно - по 70 мб в оперативеи выше каждый - дорого. Евентлеты и гевенты - похожие вещи и мы рассмотрим последние.
  12. Гевент или Джиэвент - это конкаренси библиотека, построенная вокруг libev
  13. Центральным понятием и неким кирпичиком в ней служат гринлеты. Это такие легковесный сопрограммы предоставляемые в питон как с-экстеншен модуль. Все гринлеты крутятся внутри главного процесса, но шедулятся кооперативно. Только один гринлет работает в отдельно взятый момент времени. Это некий спинов стэклеса. И это, еще раз, корутин или легковесные треды, как их часто называют.
  14. Ою=б эвент лупе я скажу лишь, что он основан на libev, и по сути является ее оберткой. И крутиться в отдельном гринлете, называемом Hub,
  15. Одна из основных идей конкурентности в том, что большую задачу можно разбить на подзадачи выполнение которых планировать одновременно или асинхронно. Переключение между двумя подзадачами называют переключением контекста. Переключение контекста в гевентах происходить через yeilding (уступление). В данном примере у нас есть два контекста, которые переключаются через вызов gevent.sleep()
  16. Детерменизм
  17. Но даже если гевенты детерминированы, источник недетерменированности может скрывать во взаимодействие с внешними сервисами, такими как сокеты и файлы. И собственно они из-за это сталкиваются с теми же проблемами, что и треды и процессы. Например, race condition - состояние гонки. В простом варианте - когда несколько потоков/процессов зависят от одного ресурса и пытаются каждый взаимодействовать на него(изменять значение). Лучший вариант - избегать глобальные состояния.
  18. Есть несколько способов пораждать гринлеты. Инициализваия нового инстанса Greenlet, вызов метода и передача неименованной функции.
  19. Ну и, кончено, можно наследоваться от гринлета и переопределить метод инит, и _run. Ну и обращу внимание на последние 3 строчки.
  20. Queues are ordered sets of data that have the usual put / get operations but are written in a way such that they can be safely manipulated across Greenlets. For example if one Greenlet grabs an item off of the queue, the same item will not be grabbed by another Greenlet executing simultaneously. На основе collections.deque
  21. Вообще библиотек гевент имеет весь джентельминский набор, тут и эвенты, и группы с пулами, и локи с семафорами и сабпроцессы, и тред локалс, позволяющиие указывать, какие данные локальны для текущего гринлета и реализовывать модель экторов в духе эрланга. Вот така вот замечательная библиотека. Но...
  22. Alas we come to dark corners of Gevent. I've avoided mentioning monkey patching up until now to try and motivate the powerful coroutine patterns, but the time has come to discuss the dark arts of monkey-patching. If you noticed above we invoked the command monkey.patch_socket(). This is a purely side-effectful command to modify the standard library's socket library.
  23. Python's runtime allows for most objects to be modified at runtime including modules, classes, and even functions. This is generally an astoudingly bad idea since it creates an "implicit side-effect" that is most often extremely difficult to debug if problems occur, nevertheless in extreme situations where a library needs to alter the fundamental behavior of Python itself monkey patches can be used. In this case gevent is capable of patching most of the blocking system calls in the standard library including those in socket, ssl, threading andselect modules to instead behave cooperatively. For example, the Redis python bindings normally uses regular tcp sockets to communicate with the redis-server instance. Simply by invoking gevent.monkey.patch_all() we can make the redis bindings schedule requests cooperatively and work with the rest of our gevent stack. This lets us integrate libraries that would not normally work with gevent without ever writing a single line of code. While monkey-patching is still evil, in this case it is a "useful evil".
  24. Spawn - вновь порождунный гринлет ассоцииурется с адресом в стэке, в котором мы в данный момент находися и больше ничего особенного не происходит. Питоновский код гринлета работает с кучей, интерпретатор продолжает работать с с-стэко Switch - когда гринлет переключается с переключаемого гринлета, то соответствующая часть с-стэка копируется (начиная с начального адреса) в кучу, а на освобожденное место копируются ранее сохраненная часть стэка переключаемого гринлета. И питоновский код переключенного гринлета продолжает работать с кучей. Return - стэк не трогается, а данные в куче очищаются сборщиком мусора
  25. С одной стороны в докладе показано, как используя некоторые мощные инструменты все равно можно столкнуться с ограничениями. И здесь приведен пример, который можно воспринимать и как расширение возможностей этого инструмента, так и, как ни странно, плавный отказ от него. Рассмотре конкурентную бибилиотеку gevent, постарался показать её сильные стороны и заглянуть в её темную поднаготную. Но это опять как к этому относиться. Инструмент с долгой историей, хорошей репутацие и достаточно мощном, но как то, мне показалось, о нем больше помалкивают и используют молча. Ну и собственно привел некоторое видение построения асинхронного RPC с помощью упомянутых инструментов, но никак не привязанное к ним.