Introduction

Receptor is an overlay network intended to ease the distribution of work across a large and dispersed collection of workers. Receptor nodes establish peer-to-peer connections with each other via existing networks. Once connected, the receptor mesh provides datagram (UDP-like) and stream (TCP-like) capabilities to applications, as well as robust unit-of-work handling with resiliency against transient network failures.

Terminology and Concepts

  • receptor: The receptor application taken as a whole, which typically runs as a daemon.
  • receptorctl: A user-facing command line used to interact with receptor, typically over a Unix domain socket.
  • node: A single running instance of receptor.
  • node ID: An arbitrary string identifying a single node, analogous to an IP address.
  • backend: A type of connection that receptor nodes can pass traffic over. Current backends include TCP, UDP and websockets.
  • control service: A built-in service that usually runs under the name control. Used to report status and to launch and monitor work.
  • netceptor: The component of receptor that handles all networking functionality.
  • workceptor: The component of receptor that handles work units.

Installation

Compile from source code (Golang 1.15.x required)

make receptor

Test the installation with

receptor --help
receptor --version

The preferred way to interact with receptor nodes is to use the receptorctl command line tool

pip install receptorctl

receptorctl will be used in various places throughout this documentation.

Basic usage

Run the following command in a terminal to start a node called foo,

receptor --node id=foo --local-only --log-level Debug

The log shows the receptor node started successfully

INFO 2021/07/22 22:40:36 Initialization complete

Supported log levels, in increasing verbosity, are Error, Warning, Info and Debug.

Note: stop the receptor process with ctrl-c

Config file

Receptor can be configured on the command-line, exemplified above, or via a yaml config file. All actions and parameters shown in receptor --help can be written to a config file.

---
- node:
    id: foo

- local-only

- log-level:
    level: Debug

Start receptor using the config file

receptor --config foo.yml

Changing the configuration file does take effect until the receptor process is restarted.

Container image

podman pull quay.io/ansible/receptor

Start a container, which automatically runs receptor with the default config located at /etc/receptor/receptor.conf

podman run -it --rm --name receptor quay.io/ansible/receptor

In another terminal, issue a basic “status” command to the running receptor process

$ podman exec receptor receptorctl status
Node ID: d9b5a8e3c156
Version: 1.0.0
System CPU Count: 8
System Memory MiB: 15865

Node         Service   Type       Last Seen           Tags            Work Types
d9b5a8e3c156 control   Stream     2021-08-04 19:26:14 -               -

Note: the config file does not specify a node ID, so the hostname (on the container) is chosen as the node ID.