NAME
IPC::MicroSocket
- minimal request/response or pub/sub mechanism
DESCRIPTION
This distribution provides two main modules for implementing servers or clients that communicate over a local UNIX socket, to exchange messages. Each client connects to one server, and a server supports multiple connected clients.
To implement a client, see IPC::MicroSocket::Client.
To implement a server, see IPC::MicroSocket::Server.
MESSAGES
There are two supported kinds of message flows:
Request/Response
A client sends a request message to the server, which consists of a command name and a list of arguments. The server eventually sends a response to it, which contains a list of values. Responses are not necessarily delivered in the requested order; servers are permitted to respond asynchronously. Requests may also fail, sending a different kind of failure response to the client instead.
Publish/Subscribe
A client subscribes to a given topic string on the server. The server can emit messages to all the clients that subscribe to a particular topic.
DATA ENCODING
All transmitted strings are purely bytes. If you need to transmit Unicode text, you must encode/decode it. If you need to send data structures that are not plain byte strings, you must serialise/deserialise them.
FAQs
Why not ZeroMQ?
I found ZeroMQ to be a lot of effort to use from Perl, and most critically it does not appear to support both request/response and publish/subscribe message flows to share the same UNIX socket. To support that in ZeroMQ it would appear to be necessary to create two separate endpoints, one for each kind of message flow.
Why not JSON/YAML/your-favourite-serialisation?
I mostly built this for a few very-small use-cases involving simple byte strings or plain ASCII text, for which the overhead of JSON, YAML, or other kinds of serialisation would be unnecessary. As the presented message semantics are just opaque byte buffers, you are free to layer on top whatever kind of message serialisation you wish.
Why not IO::Async/Mojo/your-favourite-event-system?
I wanted to use this distribution as an exercise in writing "pure" Future-driven event logic, as an experiment to test out Future::Selector and other related design shapes.
TODO
There are a number of additional features that this module could support. Each will be considered if a use-case arises. Each would add extra code and possible dependencies, and take away from the "micro" nature of the module, so each would have to be considered on individual merit.
Configurations for encoding and serialisation of arguments.
Unsubscribe from individual topics by request.
Helper methods for other socket types, such as TCP sockets.
Flexible matching of subscription topics; such as string prefixes or delimited component paths.
Other kinds of message flows, such as server-buffered streams with atomic catchup-and-subscribe semantics ensuring clients receive all the buffer.
AUTHOR
Paul Evans <leonerd@leonerd.org.uk>