The goal of this project is to facilitate the creation of microservices interacting via a signal bus and/or queue broker.
The philosophy of this project is to present a microservice as a software agent that directly interacts only with queues and the event bus, and not with other microservices.
Tool is intended for developing:
- distributed apps with event-driven architecture
- distributed apps with data-driven architecture
- multi-processors apps
Tool provide features:
- running a periodical tasks (interval or as CRON)
- specification of signals (events), their sending and receiving via the bus (
redis <bus>
) - description of queues, sending and receiving messages via the queue broker (amqp, kafka, redis)
- limited RPC via signal bus
- launching sub-services (in the same process)
- launching a group of microagents (each in a separate process)
- mocks for bus and broker
class Agent(MicroAgent):
@on('pre_start')
async def setup(self):
pass # init connections to DB, REDIS, SMTP and other services
@periodic(period=5)
async def refresh_cache(self):
pass # do something periodicly
@cron('0 */4 * * *')
async def send_report(self):
pass # do something by schedule
# subscribe to signals (events)
@receiver(signals.user_updated, signals.user_deleted)
async def send_notification(self, **kwargs):
# send signal (event) to bus
await self.bus.check_something.send(sender='agent', **kwargs)
# message consumer from queue
@consumer(queues.mailer)
async def send_emails(self, **kwargs):
# send message to queue
await self.broker.statistic_collector.send(kwargs)
async def main():
bus = RedisSignalBus('redis://localhost/7')
broker = RedisBroker('redis://localhost/7')
# usage bus and broker separate from agent
await bus.started.send('user_agent')
await broker.mailer(data)
agent = Agent(bus=bus, broker=broker)
await agent.start()
agent periodic bus broker hooks launcher
redis amqp kafka mocks
example_agents example_run
genindex
modindex
search