﻿<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet href="scheduler.xsl" type="text/xsl"?>
<!--
    title               = "Verteilte Aufträge"
-->
<description
    title               = "Distributed Orders"
    base_dir            = ""
    author              = "$Author: al $"
    date                = "$Date: 2012-06-12 21:42:49 +0200 (Di, 12 Jun 2012) $"
>
	
	<h2>
		Distributed Order Processing
<!--Load Balancing mit verteilten Aufträgen-->
	</h2>
	
	<p>
		
		A JobScheduler cluster can be used to distribute orders for processing on more than one node. 
		This feature can be used for load balancing - 
		reducing processing times by using more hardware to process an order.
<!--Ein JobScheduler Cluster kann verwendet werden, um Aufträge auf mehreren nodes zu verarbeiten. Dies kann zum 
		Load Balancing genutzt werden, um Verarbeitungszeiten durch einsatz weiterer Hardware zu minimieren.-->
	</p>
	
	<p>
		All the JobSchedulers in a cluster indicate their availability by sending out heartbeats (to the database). 
		At the same time they check the availability of all the other JobSchedulers in the cluster. 
		Should a JobScheduler determine that the heartbeat of another JobScheduler has been missing for a longer period of time
		(approx. 1-2 minutes), then it takes over the processing of the orders started by the missing JobScheduler.
<!--In einem Cluster zeigen alle JobScheduler ihre Verfügbarkeit durch das Versenden von Herzschlägen an. 
		Alle JobScheduler prüfen, ob die jeweils anderen JobScheduler verfügbar sind. 
		Stellt ein JobScheduler fest, dass vom anderen JobScheduler die Herzschläge über einen längeren Zeitraum
		(ca. 1-2 Minuten) ausbleiben, so übernimmt dieser die Verarbeitung der angefangenen Aufträge.-->
	</p>
	<p>
		The conditions under which a JobScheduler cluster can be used for distributed orders are 
		schematically represented on the following diagram and described in the next section.
<!--Die Voraussetzungen für die Operation eines JobScheduler Clusters für verteilte Aufträge
		sind schematisch in der folgende Zeichnung abgebildet, und werden im Detail in den nächsten Abschnitt beschreiben.-->
	</p>
	<img src="images/job_scheduler_distributed_orders_1.jpg" style="margin: 20px 0px ; border:1px solid gray;"/>
	<p>
		Distributed orders can be processed from different JobSchedulers on their way along a job chain. 
		The handing over of the processing of an order to another job node on another JobScheduler
		is schematically illustrated in the following diagram:
<!--Verteilte Aufträge können während ihres Weges durch die Job-Kette von verschiedenen JobSchedulern verarbeitet werden. 
		Die Übernahme der Verarbeitung eines Auftrags in einem anderen Job-Knoten durch einen anderen JobScheduler
		ist schematisch in der folgende Zeichnung abgebildet:-->
	</p>
	<img src="images/job_scheduler_distributed_orders_2.jpg" style="margin: 20px 0px ; border:1px solid gray;"/>
	
	
	<h3>
		The Requirement for using Distributed Orders
<!--Voraussetzungen für Verteilte Aufträge-->
	</h3>
	
	<ul>
		<li>
			All the JobSchedulers in the cluster must use the same database.
	<!--Alle JobScheduler des Clusters verwenden die selbe Datenbank. 
			Es werden die Datenbanksysteme Oracle, DB2, MySQL und Postgres unterstützt.-->
		</li>
		<li>
			The JobSchedulers must all use the same configuration file or an exact copy.
	<!--Alle JobScheduler verwenden die selbe Konfigurationsdatei bzw. eine genaue Kopie.-->
		</li>
		<li>
			All the JobSchedulers must be started with the same JobScheduler ID. 
	<!--Alle JobScheduler werden mit der gleichen Scheduler-ID gestartet. -->
		</li>
		<li>
			The JobSchedulers must all be started with the <scheduler_option name="distributed-orders"/> option. 
	<!--Alle JobScheduler werden mit der Option <scheduler_option name="distributed-orders"/> 
			gestartet. -->
		</li>
		<li>
			All the JobSchedulers must have access to any resources required by jobs run on a distributed job chain
			- for example, monitored directories. Directories which are used by all the JobSchedulers 
			must be mounted (or linked) on the same path on all systems.
	<!--Alle JobScheduler haben Zugriff auf Resourcen, die von den Jobs der verteilten Job-Kette benötigt
			werden (z.B. überwachte Verzeichnisse). Gemeinsam genutzte Verzeichnisse sind auf allen Systemen
			auf den gleichen Pfad gemountet (oder verlinkt).-->
		</li>
	</ul>
	
	<h3>
		Starting a JobScheduler Cluster for Distributed Orders
<!--Starten des JobScheduler Clusters für verteilte Aufträge-->
	</h3>
	
	<p>
		The JobSchedulers making up the cluster can be started in any order. 
		Any JobScheduler belonging to the cluster can be removed or added as required whilst the cluster is in operation. 
		When a JobScheduler is removed from a cluster it should, where possible, be stopped (terminated) normally,
		to allow any orders which are being processed at the time to be completed.
<!--Die JobScheduler, die den Cluster bilden, werden in beliebiger Reihenfolge gestartet. 
		Es können während der Laufzeit beliebig JobScheduler entfernt oder hinzugefügt werden. Beim entfernen
		von JobScheduler Instanzen, sollten diese, wenn möglich, normal beendet (Terminate) werden,
		damit sie die Möglichkeit haben, Aufträge zu beenden, die gerade verarbeitet werden.-->
	</p>
	
	<h3>
		Generation of Distributed Orders
<!--Erzeugen verteilter Aufträge-->
	</h3>
	
	<p>
		Distributed Orders can either be generated by  the <scheduler_element name="add_order"/> command 
		or by directory monitoring.
        A persistent order can not be used as a distributed order.
<!--Verteilte Aufträge können entweder per <scheduler_element name="add_order"/> Befehl oder per Verzeichnisüberwachung
		erzeugt werden.-->
	</p>
	
	<h3>
		Distributed Orders Using add_order
<!--Verteilte Aufträge durch add_order-->
	</h3>
	
	<p>
		Either the <scheduler_element name="add_order"/> eAPI command or the 
		<scheduler_method class="Job_chain" method="add_order" java_signature="Order"/> iAPI function
		can be used.
		Neither the JobScheduler to which the command is sent to nor the JobScheduler on which the command is carried out
		is important - the order will be made available to the whole cluster for processing. 
<!--Es kann entweder das XML-Kommando <scheduler_element name="add_order"/> oder die API-Funktion 
		<scheduler_method class="Job_chain" method="add_order" java_signature="Order"/> verwendet werden.
		Es ist dabei egal an welchen JobScheduler das Kommando geschickt wird beziehungsweise auf welchem
		JobScheduler der Befehl ausgeführt wird. Der Auftrag wird dem gesamten Cluster zur Verarbeitung bereitgestellt.-->
	</p>
	
	<h3>
		Distributed File Orders
<!--Verteilte Dateiaufträge-->
	</h3>
	
	<p>
		Distributed File Orders are configured in a distributed job chain using 
		<scheduler_element name="file_order_source"/>. 
		Each JobScheduler in the cluster monitors the relevant directory or directories and can create file orders.
		A file order can be processed by a different JobScheduler to the one that created the order.
<!--Verteilte Dateiaufträge werden per <scheduler_element name="file_order_source"/> in einer verteilten Job-Kette
		konfiguriert. Jeder JobScheduler des Clusters überwacht das Verzeichnis und kann Dateiaufträge erstellen.
		Ein Dateiauftrag wird nicht notwendigerweise von dem JobScheduler verarbeitet, der ihn erstellt hat.-->
	</p>
	
	<h3>
		Stand-Alone Jobs with Distributed JobSchedulers
<!--Standalone-Jobs in verteilten Schedulern-->
	</h3>
	
	<p>
		Independent jobs which do not process orders are processed in a JobScheduler cluster by the JobSchedulers 
		with which they were configured.
<!--Eigenständige Jobs, die keine Aufträge verarbeiten, werden in einem JobScheduler Cluster nur von dem JobScheduler ausgeführt,
		in dem sie konfiguriert werden..-->
	</p>

    <h3>
        Load balancing methods
    </h3>
    <p>
        The method used for load balancing can be set using the <a href="xml/param.xml#scheduler.order.distributed.balanced">scheduler.order.distributed.balanced</a> global parameter:
        <ul>
            <li>
                <b>Overload balancing</b>:
                <p>
                    With this method, an additional JobScheduler of the cluster takes over the execution of a distributed order when the JobScheduler initially processing the order is working at maximum capacity - i.e. the allowed number of processes reaches a maximum value.
                    This is the standard balancing method used by the JobScheduler.
                </p>
                <p>
                    see also <scheduler_element name="job" attribute="tasks"/> and <scheduler_element name="process_class" attribute="attribute_max_processes"/>.
                </p><br/>
            </li>
            <li>
                <b>Equal distribution</b>:
                <p>
                    With this method, distributed order tasks are allocated equally to the JobSchedulers in a cluster.
                </p>
            </li>
        </ul>
    </p>

</description>
