XPherior
Streamlining event data infrastructure
A low-tech primer on event data for your boss
Complex event processing in Clojure and ClojureScript
Turn plain Clojure code into streaming microservices
Rapidly connecting realtime event streaming to programming languages
Challenges of Record Replay in Event Streaming Architectures
The Future of Event Stream Processing
Simulate Big Data Computations in the Browser
Onyx: High Performance Cluster Computation for Clojure
Onyx: High Performance, Distributed Batch and Stream Processing
Onyx: Flexible Stream Processing for the JVM
Clojure Conj 2015: Onyx โ Distributed Computing in Clojure
Onyx 0.7.0: High Performance Cluster Computing in Clojure
Onyx 0.6.0: Going Faster
The tree model is being removed in 0.6.0 in favor of a vector of vectors (DAG), which allows multiple inputs. See https://github.com/MichaelDrogalis/onyx/blob/0.5.x/doc/user-... The tree model wasn't one of my better ideas.
Edit: to be clear, you can do stream joins right now in 0.5.3 with the DAG model.
Onyx goes a little further though in terms of its catalog. I wanted more of the computation to be pulled out into a data structure. That includes runtime parameters, flow, performance tuning knobs, and grouping functions. All of these things are represented as data in Onyx. It's a little harder, at least in my experience, to do these things in Storm.
- Onyx's log doesn't grow particularly large because it's only used for coordination, not for messaging.
- Because the log isn't huge, and can be GC'ed, consumers don't experience high volumes of messages.
- ZooKeeper offers sequential node creation - making it a really good fit for what the log needs to do.
Information models are often superior to APIs, and almost always better than DSLs. The hyper-flexibility of a data structure literal allows Onyx workflows and catalogs to be constructed at a distance, meaning on another machine, in a different language, by another program, etc. Contrast this to Storm. Topologies are written with functions, macros, and objects. These things are specific to a programming language, and make it hard to work at a distance - specifically in the browser. JavaScript is the ultimate place to be when creating specifications.
Further, the information model for an Onyx workflow has the distinct advantage that it's possible to compile other workflows (perhaps a datalog) into the workflow that Onyx understands.
See https://github.com/MichaelDrogalis/onyx/blob/0.5.x/doc/user-... for a continued explanation of why Onyx is more of an "open" concept.
These are all the things I wrote down that I wanted before I wrote the first line of code.
I'm also not a Spark user, but I have used Storm:
- Storm is significantly more mature and performant the moment.
- Storm has a better cross-language story in terms of bolt functions.
- Pretty much everything in Onyx is much more open ended. This applies to deployment, program structure, and workflow creation - and is mostly an artifact of how aggressively Onyx uses data structures.
- Onyx has a far better reach across languages in terms of its information model.
- Onyx will be adopting a tweaked version of Storm's message model next release to get on the same level of performance and reliability. We're dropping the HornetQ dependency.
- Onyx is born out of years of frustration of direct usage of Storm and Hadoop.
Onyx 0.5.0: The Cluster as a Value
Onyx 0.4.0: DAG workflows, catalog grouping, lib-onyx
I talked a little bit about why I wrote Onyx on the Clojure mailing list: https://groups.google.com/d/msg/clojure/OmHzAEfYe9U/33e0a0l3...
It's mostly driven by the need to use data structures in places where I didn't have them - I only had things like macros and functional composition.