A framework for processing data on SNS+SQS and/or Kinesis streams.

 See the README.md file in qs-core/src/main/java/com/blacklocus/qs/drivers/ for an overview and examples.
I haven't fully formed an opinion on this pattern. It is definitely simpler if every function produces one output, just one return. The reality contrasts that some functions will produce multiple messages, and possibly messages of differing types (e.g. As, Bs, and errors).

In its dumbest form, this takes the shape of injecting Writers into the function code where the fn can emit messages however it pleases, which is what I usually see today and am totally fine with. It's a little irksome as message emission may not have as strong of a pattern across all functions; they all end up emitting messages how they want to, but it is very easy to write and completely flexible, and with a clean writer interface still pretty easy to keep track of.