Invocation Communication#
Task invocations in lifeblood can easily exchange data messages through worker’s network api
Overview#
Any invocation may send arbitrary data to another invocation. for that it needs to know only 2 things:
target invocation id
target addressee name
since it requires to know target invocation id - this means that most likely it has to be passed from parent task’s invocation to child task, so that child later may report result or something else.
addressee name is just some string identifying the receiver. single invocation may be waiting for multiple messages in parallel, so addressee name here acts as sort of a port
Message is sent through worker, then routed to scheduler, where scheduler routes it to the worker which is running the target invocation, if any.
The worker’s messaging API includes 2 methods so far:
send a message to invocation id + addressee name
wait for a message addressed to given addressee name
Some design details: (not implementation-specific)
In ordinary situation send_message will return when message was delivered to target invocation’s addressee name
Otherwise error text will be available from worker
If target invocation is already running, but addressee name is not yet waiting for messages - this is considered a valid situation and addressee name will be waited for some time (default 90 seconds, which should be more than enough) to start receiving message. If not - timeout error will be produced
If target invocation is NOT running - this is considered an error situation straight away, no waiting is done. The error will reflect if target invocation is already finished, or does not exist at all.
if both send end receive commands may have timeouts
Python case#
In case of python - worker’s network API is wrapped with a small and simple python module lifeblood_connection
When a task invocation is run by worker, an additional path is injected into PYTHONPATH
environment variable. This makes it possible for any script running python to load
lifeblood_connection
module
lifeblood_connection
module has no non-standard dependencies, and is in fact python-2/3 compatible.
It is made this way to ensure no pollution of python environment is done.
lifeblood_connection
module presents a number of very handy methods to easily communicate with Scheduler,
here we will only talk about invocation messaging related functions
functions:
message_to_invocation_send
function does the sendingOn error
MessageSendError
will be raised with error cause text
message_to_invocation_receive
function waits for receiving, optionaltimeout
may be providedOn timeout
MessageReceiveTimeout
will be raised
Other languages#
There is currently no support for other languages, but it can be easily added, as worker’s command web API is very simple