Wolkenkit 3.0 – a CQRS and event-sourcing framework for JavaScript
thenativeweb.io
thenativeweb.io
"wolkenkit is a CQRS and event-sourcing framework for JavaScript and Node.js which fits perfectly with domain-driven design (DDD). It provides the technical foundation for your application, including an event-store and a scalable real-time API. This allows you to focus on what's essential: Solving actual real-world problems in no time."
I've been a developer for decades and this means almost nothing to me. I'm sorry if this comes across as harsh - I'm just trying to be helpful. What's your elevator pitch for this product? I'm not looking for CQRS because I don't know what it is. How many more people might you attract to your product if you could translate your pitch into how it benefits me? It's really hard coming up with your one-liner in plain English. But every time I see a one-liner that means very little to me as a programmer (which is unfortunately most projects), I encourage folks to put in the effort. Otherwise, I just skip over it and move on. And I'm guessing I'm not the only one.
Here's a one liner I think works well: "React: A JavaScript library for building user interfaces".
I hope that helps.
We have had a very hard time to grasp what's special with CQRS and event-sourcing, and to put it into a one-liner, but basically, I agree with you.
And the next step is putting your one-liner everywhere that people first come across your product. On your website main page, and especially at the beginning of blog articles.
I guess this is becoming enough of a pet peeve of mine that I should write about it myself and give examples of good vs. bad and why to do it.
Maybe https://docs.wolkenkit.io/3.0.0/getting-started/understandin... is a good place to start.
So this is the ONLY framework that provides an implememtation of CQRS and event-sourcing? What I was trying to get at is to try to tell me why you're different and better.
None of this is easy. One-liners are very hard to get right. But it's worth the work.
Actually, inspired by your comments, I'm currently sitting at my desk, thinking about how to improve the claim.
I would love to discuss things with you. If you are interested in exchanging ideas as well, feel free to contact me via mail (hello@thenativeweb.io).
For me event-sourcing is a historical layer below your existing database that allows you to replay the sequence of events that got your database to its current state.
If I had to businessify it, maybe it would be 'Wolkenkit is a framework that allows you to save and replay your entire business's history so you never miss a key insight again.'
From a technical perspective, engineers can focus on the product and organically build and destroy the data structures around a changing business instead of trying to find the perfect data-structures that will inevitably be incorrect as the business grows and evolves. You get regression tests for free, and you get backups for free which may be nice-to-haves when the business is small, but absolute requirements once you have real customers paying real money. Not sure how I would squeeze that in an elevator pitch though.
Greg Young's presentation on event-sourcing is pretty great, you may find some inspiration there:
In other words, a transaction log.
Thanks for the idea!
- Excellent auditing abilities
- "time-traveling" debugging (you get the entire history of what happened)
- Easy backup abilities (append-only stores are objectively easier to backup)
- Datastores tailored to your querying requirements (say bye to monstruous SQL queries)
These are the things you see on CQRS-related websites. Then you decide to try it or to research conference talks and such and you find out the downsides:
- Data deletion is now a PITA (and you need it if only for legal reasons)
- Doing actual transactions (in the ACID sense) is now somewhere between hard and impossible
- Welcome to the magic world of non-linearizable datastore operations. Here be dragons.
- If you make a mistake (wrong event / wrong data in an event) you will suffer from it greatly, possibly for all eternity.
Another problem with event sourcing is that there is no easily definable concept of a "field" that can be read from and written to using a named address (contrast with a SQL table column identifier). For a given aggregate, you'll have a single command service that writes a set of "fields" and an unbounded number of query services that receive a copy of that "field" from the event stream and can transform it in any imaginable way. Your "field" may be renamed and moved around through its journey from your command service's API request body to your event's serialized form and to your query service's internal data structures and its final resting place on the query service's persistence data store (mongodb or SQL table or whatever).
To identify a field, it's best to use its writable address, and you'll need to come up with your own identifier namespace and naming convention to represent those addresses.
True. I was reading to the comments here and yes, most of them were focusing on the Event Sourcing part of Wokenkit, not the CQRS so my mind got tricked.
That said, I think that’s what frameworks are all s about. I’m using Kafka Streams which is an amazing foundation for CQRS/ES but the absence of a framework for it means you need to implement all these models/patterns by hand. It’s pretty hard.
> It’s like you’re expressing frustration about not knowing something
I'm not. I'm trying to help startups and small projects do a better job of communicating what value they add so that potential customers and users don't skip over their project.
As others have pointed out, neither of those two are useful if you don't know what "user interfaces" or "event sourcing" are.
What you're looking for is this: https://martinfowler.com/eaaDev/EventSourcing.html
"Wolkenkit: A JavaScript library for building event-sourcing applications.
Event sourcing is an alternative to relational databases and uses a transaction log as the primary source of data which gives you a true history of how data has changed. This allows you to put your application in any prior state which is useful for debugging, audit, traceability, and easier backups along with other benefits. Wolfenkit is the fastest JavaScript event sourcing framework by far."
I'm sure someone could do even better than that. But now any programmer who comes across this knows what event sourcing is at a very basic level, some of the benefits, and why this particular framework should be considered. A lot accomplished.
I also think it's fair to point out that "user interface" is a term every programmer knows. I typically read an hour or two a day from a variety of tech sources to keep up on best practice in programming, and I just now heard of event sourcing. I could just be out of it, but Google search shows about 219,000 results for "event sourcing" and about 78 million results for "user interface". I think I'm on solid ground saying that one deserves to be explained and the other is common knowledge.
EDIT: here is another one liner from another comment that I think works great: "Wolkenkit is a framework that allows you to save and replay your entire business's history so you never miss a key insight again." No jargon. Gives a key benefit. I'm interested. Maybe even as a business person. Tell me more.
Sometimes libraries are there to solve problems that you only have when doing a certain thing a lot and you are involved in that any way. That's when abstractions happen. CQRS/DDD are quite established enterprise patterns, these are not for everyone, on the contrary. Probably you don't want to do this.
And, it's a matter of continuum anyway and where in the continuum your 1-liner should draw its line; web pages for programming languages need not (and should not) explain what programming is, how computers work, 2's complement, bits, etc.
PS- Move the code, not the data.
It's on you to know those concepts so you can understand these terms. Would you read technical descriptions that a doctor would be familiar with and complain that they don't explain all the basics for you? Perhaps you should invest effort in learning instead of skipping it and moving on?
Tech is a big field, it has a ridiculous amount of vocab. Unlike Doctors, we didn't standardize heavily.
The op says the product devs should "put in effort" otherwise the op will "skip over it and move on". This is backwards because it's up to you to learn things you don't know.
My point is that your elevator pitch, and what's on the landing page of your website, shouldn't tell me what cool buzzwords you use in your tech stack. Potential users / customers generally don't care. They care about how it benefits them.
> It's on you to know those concepts so you can understand these terms.
It's not if you want me as a customer. I don't have the time to look into the literally thousands of projects out there asking for my attention and then to learn the jargon to see if the project perhaps meets one of my current needs. Usually it doesn't. So if you want my attention, tell me how it benefits me. It's not going to hurt me to skip over it. A smaller project that gets no attention will just eventually die. So small projects / startups need to make their value proposition very clear if they want to stand out from the crowd. That's why incubators like Y Combinator insist you spend the time to get your elevator pitch right.
> Would you read technical descriptions that a doctor would be familiar with and complain that they don't explain all the basics for you?
If I were a busy doctor, I would want to start with the one liner "treats depression faster than other drugs in its class and with fewer side effects". Now I'm interested enough to read the tech details and why.
Bad: React is an ES 2015 JS framework that uses JSX along with Babel and Webpack to create a virtual DOM along with efficient tree diff algorithms to prevent unnecessary renders.
Who cares? It sounds like a bunch of bragging about implementation.
Good (from their landing page): React makes it painless to create interactive UIs. Design simple views for each state in your application, and React will efficiently update and render just the right components when your data changes.
Now I know how it benefits me. Almost zero jargon, and what jargon they use is very basic.
I hope that helps you understand where I'm coming from. Which is an attempt to help startups and small projects get their one-liner / elevator pitch right. Get it right, and then I'll be interested in how you implement it.
Also, can anyone tell me what this even does? I've been clicking around and besides a bunch of vapid "philosophy" documents I can't figure out what the fuck anyone would use this for...
In event sourcing, instead of having stateful objects, you have a log of events that you use to build that state. It gives you powerful rollback, backup, and history features at the expense of some insane code complexity (usually solved by tooling). When paired with CQRS, another architecture separating reads and writes in your abstractions, and done well with events that are domain oriented ("AccountingReconciliationStarted" instead of "StartButtonClicked"), you can hide most of the code complexity and allow developers and less technical users to focus on domain complexity (i.e., the logic that matters to the real world).
At least in theory.
If you don't want to do this, you need to get an enterprise license, which does not neccessarily mean to buy one: There are other options as well (sponsored development, …).
For details, please contact us directly using hello@thenativeweb.io
PS: I'm one of the core developers of wolkenkit.
And you know what? It was true. We changed the licensing to MIT for most of Opa (http://opalang.org), but maybe a bit too late.
Are there any companies using this in prod already? Or any load experiment numbers? Proving that this actually is a "scalable real-time API"?
Yes, it is already running in production, but due to NDAs, unfortunately I can't provide any details here.
Regarding the scalability most is prepared, but there are still a few things that need to be done. We would be more than happy for anyone who wants to contribute or to sponsor us. For details see https://github.com/thenativeweb/wolkenkit/issues/90
I don't see any messages in my network console, so it seems the message form is actually not really sending anything and the app is not a real wolkenkit app. Am I right?
is this like Datomic?
Regarding Datomic: I'm not an expert for Datomic, but AFAICS Datomic is primarily a database, while wolkenkit is an out-of-the-box full-featured framework for business logic, storage and so on.
Event sourcing itself is a fairly straightforward concept which the parent does sum up though - store events which describe what happened to an entity in a system rather than the resulting state. The state of an object can be derived via application of a left fold over the history.
[1]: https://willi.am/blog/2014/10/14/for-the-last-time-git-store... - this is the best reference I can find quickly, though the git manual would obvioiusly be more authoritative.
Conceptually, it's still capturing the deltas, instead of storing the current state and overwriting it. Storing the history is the key ingredient here, and of course, there are differences in how to achieve this.
Both are common in systems, but only the latter is event sourcing - at least if the definition is to have any use and not become overloaded.
This gives a few nice advantages. For example, with this system in hand you can now also ask "What was the balance 30 days ago".