/* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.apache.ignite.configuration; import org.jetbrains.annotations.Nullable; /** * Grid deployment mode. Deployment mode is specified at grid startup via * {@link org.apache.ignite.configuration.IgniteConfiguration#getDeploymentMode()} configuration property * (it can also be specified in Spring XML configuration file). The main * difference between all deployment modes is how classes are loaded on remote nodes via peer-class-loading mechanism. * <p> * The following deployment modes are supported: * <ul> * <li>{@link #PRIVATE}</li> * <li>{@link #ISOLATED}</li> * <li>{@link #SHARED}</li> * <li>{@link #CONTINUOUS}</li> * </ul> * <h1 class="header">User Version</h1> * User version comes into play whenever you would like to redeploy tasks deployed * in {@link #SHARED} or {@link #CONTINUOUS} modes. By default, Ignite will * automatically detect if class-loader changed or a node is restarted. However, * if you would like to change and redeploy code on a subset of nodes, or in * case of {@link #CONTINUOUS} mode to kill the ever living deployment, you should * change the user version. * <p> * User version is specified in {@code META-INF/ignite.xml} file as follows: * <pre name="code" class="xml"> * <!-- User version. --> * <bean id="userVersion" class="java.lang.String"> * <constructor-arg value="0"/> * </bean> * </pre> * By default, all ignite startup scripts ({@code ignite.sh} or {@code ignite.bat}) * pick up user version from {@code IGNITE_HOME/config/userversion} folder. Usually, it * is just enough to update user version under that folder, however, in case of {@code GAR} * or {@code JAR} deployment, you should remember to provide {@code META-INF/ignite.xml} * file with desired user version in it. * <p> * <h1 class="header">Always-Local Development</h1> * Ignite deployment (regardless of mode) allows you to develop everything as you would * locally. You never need to specifically write any kind of code for remote nodes. For * example, if you need to use a distributed cache from your {@link org.apache.ignite.compute.ComputeJob}, then you can * the following: * <ol> * <li> * Simply startup stand-alone Ignite nodes by executing * {@code IGNITE_HOME/ignite.{sh|bat}} scripts. * </li> * <li> * Now, all jobs executing locally or remotely can have a single instance of cache * on every node, and all jobs can access instances stored by any other job without * any need for explicit deployment. * </li> * </ol> */ public enum DeploymentMode { /** * In this mode deployed classes do not share resources. Basically, resources are created * once per deployed task class and then get reused for all executions. * <p> * Note that classes deployed within the same class loader on master * node, will still share the same class loader remotely on worker nodes. * However, tasks deployed from different master nodes will not * share the same class loader on worker nodes, which is useful in * development when different developers can be working on different * versions of the same classes. * <p> * Also note that resources are associated with task deployment, * not task execution. If the same deployed task gets executed multiple * times, then it will keep reusing the same user resources * every time. */ PRIVATE, /** * Unlike {@link #PRIVATE} mode, where different deployed tasks will * never use the same instance of resources, in {@code ISOLATED} * mode, tasks or classes deployed within the same class loader * will share the same instances of resources. * This means that if multiple tasks classes are loaded by the same * class loader on master node, then they will share instances * of resources on worker nodes. In other words, user resources * get initialized once per class loader and then get reused for all * consecutive executions. * <p> * Note that classes deployed within the same class loader on master * node, will still share the same class loader remotely on worker nodes. * However, tasks deployed from different master nodes will not * share the same class loader on worker nodes, which is especially * useful when different developers can be working on different versions * of the same classes. */ ISOLATED, /** * Same as {@link #ISOLATED}, but now tasks from * different master nodes with the same user version and same * class loader will share the same class loader on remote * nodes. Classes will be undeployed whenever all master * nodes leave grid or user version changes. * <p> * The advantage of this approach is that it allows tasks coming from * different master nodes share the same instances of resources on worker nodes. This allows for all * tasks executing on remote nodes to reuse, for example, the same instances of * connection pools or caches. When using this mode, you can * startup multiple stand-alone Ignite worker nodes, define resources * on master nodes and have them initialize once on worker nodes regardless * of which master node they came from. * <p> * This method is specifically useful in production as, in comparison * to {@link #ISOLATED} deployment mode, which has a scope of single * class loader on a single master node, this mode broadens the * deployment scope to all master nodes. * <p> * Note that classes deployed in this mode will be undeployed if * all master nodes left grid or if user version changed. User version can * be specified in {@code META-INF/ignite.xml} file as a Spring bean * property with name {@code userVersion}. This file has to be in the class * path of the class used for task execution. * <p> * {@code SHARED} deployment mode is default mode used by the grid. */ SHARED, /** * Same as {@link #SHARED} deployment mode, but resources will not be undeployed even after all master * nodes left grid. Tasks from different master nodes with the same user * version and same class loader will share the same class loader on remote * worker nodes. Classes will be undeployed whenever user version changes. * <p> * The advantage of this approach is that it allows tasks coming from * different master nodes share the same instances of resources on worker nodes. This allows for all * tasks executing on remote nodes to reuse, for example, the same instances of * connection pools or caches. When using this mode, you can * startup multiple stand-alone Ignite worker nodes, define resources * on master nodes and have them initialize once on worker nodes regardless * of which master node they came from. * <p> * This method is specifically useful in production as, in comparison * to {@link #ISOLATED} deployment mode, which has a scope of single * class loader on a single master node, <tt>CONTINUOUS</tt> mode broadens * the deployment scope to all master nodes. * <p> * Note that classes deployed in <tt>CONTINUOUS</tt> mode will be undeployed * only if user version changes. User version can be specified in * {@code META-INF/ignite.xml} file as a Spring bean property with name * {@code userVersion}. This file has to be in the class * path of the class used for task execution. */ CONTINUOUS; /** Enum values. */ private static final DeploymentMode[] VALS = values(); /** * Efficiently gets enumerated value from its ordinal. * * @param ord Ordinal value. * @return Enumerated value. */ @Nullable public static DeploymentMode fromOrdinal(int ord) { return ord >= 0 && ord < VALS.length ? VALS[ord] : null; } }