Multiple Engines

The simplest and safest way is to run a separate Axon Ivy Engine installation per tenant or per customer. Doing so brings the following advantages:

  • Security: Per customer, a separate installation assures that tenants are isolated on the infrastructure level. It is impossible for a customer to see data from another customer due to programming errors or misconfigurations.

  • Scaling: A separate Axon Ivy Engine per tenant is simple to maintain and scales very well. On the other hand, if you run an Axon Ivy Cluster installation and let all customers run on that cluster, you can of course add more and more nodes to the cluster to handle the additional load. However, the cluster solution is not scaling infinitely. Because adding more nodes induces more communication between the nodes, the network bandwidth available between the cluster nodes limits its growth potential. At that point, adding more nodes actually makes the cluster slower.

  • Canary Deployments: Introducing new features always carries risks. Instead of rolling out a new feature to all customers in one fell swoop, only a portion of the customers are provided with the new version. If something goes wrong, only that portion is affected. With a separate Axon Ivy Engine per tenant, Canary Deployments are easy to implement.

  • Stability: If a customer’s Axon Ivy Engine crashes, only that customer is affected. All other customers are not affected by that crash.

These are the main reasons why multi-tenancy with isolated Axon Ivy Engine installations is the best way to implement multi-tenancy. We recommend using container environments such as Docker, Kubernetes or OpenShift, which have solved the provisioning cleanly and keep administrative overhead to a minimum.

Get started with our Axon Ivy Engine Docker container here.


digraph engine { layout=neato; node [shape=box, height="0.8", width="2", color="#007095", style=filled, fixedsize="true", margin=0, fontname="Roboto,Helvetica Neue,Arial,sans-serif", fontcolor="white", fontsize=15 ]; /* nodes */ kubernetes [ label="Kubernetes", pos="0,0!" width=7 height=4.7 style="dashed" fontcolor="black" labelloc="t"]; engine1 [ label="Axon Ivy Engine\nContainer Tenant 1", pos="-2,0.0!" width=2 height=4 style="dashed" fontcolor="black" labelloc="t"]; engine2 [ label="Axon Ivy Engine\nContainer Tenant 2", pos="0,0.0!" width=2 height=4 style="dashed" fontcolor="black" labelloc="t"]; engineN [ label="Axon Ivy Engine\nContainer Tenant N", pos="2,0.0!" width=2 height=4 style="dashed" fontcolor="black" labelloc="t"]; users1 [ label="Users", pos="-2,1.2!", width="1.7", height="0.5", style="dashed" fontcolor="black"]; roles1 [ label="Roles", pos="-2,0.5!", width="1.7", height="0.5", style="dashed" fontcolor="black"]; processes1 [ label="Processes", pos="-2,-0.2!", width="1.7", height="0.5"]; tasklist1 [ label="Task list", pos="-2,-0.9!", width="1.7", height="0.5"]; applications1 [ label="Applications", pos="-2,-1.6!", width="1.7", height="0.5"]; users2 [ label="Users", pos="0,1.2!", width="1.7", height="0.5", style="dashed" fontcolor="black"]; roles2 [ label="Roles", pos="0,0.5!", width="1.7", height="0.5", style="dashed" fontcolor="black"]; processes2 [ label="Processes", pos="0,-0.2!", width="1.7", height="0.5"]; tasklist2 [ label="Task list", pos="0,-0.9!", width="1.7", height="0.5"]; applications2 [ label="Applications", pos="0,-1.6!", width="1.7", height="0.5"]; usersN [ label="Users", pos="2,1.2!", width="1.7", height="0.5", style="dashed" fontcolor="black"]; rolesN [ label="Roles", pos="2,0.5!", width="1.7", height="0.5", style="dashed" fontcolor="black"]; processesN [ label="Processes", pos="2,-0.2!", width="1.7", height="0.5"]; tasklistN [ label="Task list", pos="2,-0.9!", width="1.7", height="0.5"]; applicationsN [ label="Applications", pos="2,-1.6!", width="1.7", height="0.5"]; }