An opinionated Redis connector for Broadway to process work from a Redis list structure.
Documentation can be found at https://hexdocs.pm/off_broadway_redis.
This project provides:
OffBroadway.Redis.Producer
- A GenStage producer that continuously pops items from a Redis list and acknowledges them after being successfully processed.OffBroadway.Redis.RedisClient
- A generic behaviour to implement Redis clients.OffBroadway.Redis.RedixClient
- Default Redis client used by OffBroadway.Redis.Producer
.Because Redis lists do not support the concept of acknowledgements, this project utilizes the RPOPLPUSH command available in Redis to atomically pop an item from the list while moving the item to a 'working' or 'processing' list for a later pseudo-acknowledgement using the LREM
command.
This idea follows the blueprint of the Reliable Queue pattern outlined in the Redis documentation found here.
Because RPOPLPUSH
is used, the other assumption is that the head of your list will be on the right side, so you will likely want to push work into your list using LPUSH
(for FIFO processing). If you want to prioritize an item to be processed next, you could push that to the right (head) by using a RPUSH
.
The default Redis client uses the Redix library. See that project for other features.
I have not attempted to use any other Redis libraries in the community at this point. I expect there may need to be changes made to this producer to accomodate others.
LREM
) is not handled - you will want some logic or process in place to move an item from the working list back to the main list.LREM
command is O(N) - so the performance on this operation during acknowledgement will be based on the length of the list. I have been using this pattern for a number of years without problem, but be aware and do research on your own use-case to ensure this is not going to be a problem for you.Add :off_broadway_redis
to the list of dependencies in mix.exs
:
def deps do
[
{:off_broadway_redis, "~> 0.4.3"}
]
end
Configure Broadway with one or more producers using OffBroadway.Redis.Producer
:
Broadway.start_link(MyBroadway,
name: MyBroadway,
producers: [
default: [
module: {
OffBroadway.Redis.Producer,
redis_instance: :some_redis_instance,
list_name: "some_list",
working_list_name: "some_list_processing"
}
]
]
)
This library was created using the Broadway Custom Producers documentation for reference. I would encourage you to view that as well as the Broadway Architecture documentation for more information.
MIT License
See the license file for details.