Hi,Mongo support is going to be supported (meaning not in incubator anymore) from Axon 2. In fact, yesterday I've spent some time on building a Serializer that serializes any object to a Mongo BSON model, so that they can be stored as native Mongo documents (in fact as part of a document). Meanwhile, Jettro is busy implementing the SagaRepository using Mongo. It's already in the incubator of 1.3. For an example, check out the Axon Trader sample application: https://github.com/AxonFramework/Axon-traderAs for scalability related command and event busses, some will be included in 2.0 as well. I've already built the dynamically scalable distributed commandbus, that does automatic routing of commands for optimal performance. We'll also soon start with an AMQP-based event bus soon. It will allow you to share events among different nodes using an AMQP compatible Message Broker, like RabbitMQ.An alternative for Quartz wouldn't really be needed. Quartz has pluggable storage, so you could use MongoDB to store the jobs for quartz. An Quartz is also capable of working in multi-node environments.I can't really give a timeline for all this yet. It depends a bit on the amount of time I can spend on it. I'm working on a sponsoring deal that will allow me to speed up things a bit. I'm hoping to be ready this summer.Cheers,Allard
Hi,Axon trader is still an single-JVM solution, but we will start migrating that to Axon 2.0 shortly. We can only start that when the Axon 2.0 API is completely final. The idea is to base the migration guide on the findings we have there.The distributed command bus is as good as finished. It can use Jgroups to dynamically connect and distribute command across members. That means that when a member drops, its share of the load is distributed over the remaining members.On the Event Bus side, I am working on AMQP connectors. At a client, where I am helping out with scaling their application, I noticed that using Spring AMQP provides a lot of features that deal with resilience, such as automatically reconnecting when a connection is lost. So the first solution will probably build on that. You can always use the Spring Integration connectors (that have been around since the early Axon days) to connect with other protocols.The use case you describe can be easily achieved by setting up a distributed command bus on each Tomcat node, with a SimpleEventBus to dispatch events locally. The distributed Command Bus will ensure that commands are consistently routed across available members. The SimpleEventBus will ensure that Event Handling (and thus query database update) is done in consistently and in the same transaction. You can use a single (clustered) database behind the machines.Note that the consistency requirement puts the bottleneck in the database. If you don't need your QueryDB to be absolutely consistent, you can use an asynchronous events bus, such as the ClusteringEventBus with an AMQP connector.Hope this helps,Cheers,
Allard
Hi guys,I understand where the idea comes from. Some colleagues have build a solution using an AMQP broker with multiple nodes processing the commands. Their conclusion: don't!The reason is that there is a major design aspect about AMQP, that doesn't make it suitable for consistent routing. The idea behind message brokers is that it abstracts sender and receiver away from eachother. The sender just sends and "assumes" that any client will receive the message. The problem is that AMQP will just place it in a queue.You cannot dispatch consistently from a queue to its recipients. If you don't care which nodes handles which command, a single queue for them to read from is your solution. If you want to consistently route commands, AMQP is not the design you're looking for."and eliminate the jgroups maintenance and management/complexity". What's so complex about JGroups? All you need is to configure a list of IP addresses or a gossip router and you're set. It's really simple. And the biggest advantage is that Axon will use JGroups to dynamically (and consistently) route commands to the members. This will ensure that commands for the same aggregate will always hit the same server. So it's perfectly safe to use a cache. The power in this solution comes from the lack of the need for a centralized registry of who does what. Such a registry would only be a single point of failure, or at least a severe bottleneck."What about using an MQ for the command messages and groups just for the coordination?"I don't see how this makes the world any easier. JGroups is perfectly fine for point to point communication. Adding MQ to the mix will take everything to another level of complexity where, honestly, I don't think the tools will really benefit from eachother.Cheers,Allard