非同期実行(優先順位の設定)
================================================================================

.. only:: html

 .. contents:: 目次
    :depth: 3
    :local:

Overview
--------------------------------------------------------------------------------

| 本ガイドラインでは、非同期実行における優先順位付けを実現するための方式を説明する。
|
| 本方式は、無料ユーザーと会員ユーザーでサービスレベル(公開までの時間)に応じた優先順位付けをバッチジョブ(キューを使用)にて実施する場合などで有効な手段となる。


.. note::

   本ガイドラインでは、キューサービスが優先順位をサポートしていない場合に優先順位を制御する方式を説明しているが、キューサービスが優先順位をサポートしている場合は、そちらの仕組みを利用されたい。



処理方式概要
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

| キューを優先順位に応じて複数用意し、実行要求メッセージを優先順位によってにキューに入れ分けることで、バッチ処理の優先順位を付ける方式。
| 本方式では、キューに対応するサーバの性能(CPU性能や台数など)は、優先順位に応じたものにしておく必要がある。

処理方式イメージ
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

本ガイドラインで紹介する優先順位を付ける方式のイメージを示す。

.. figure:: ./imagesAsynchronousProcessing/PriorityQueue.png
   :alt: Screen image of asynchronous processing.
   :width: 100%

上記イメージでは、アプリケーションサーバはフロントサーバとバックサーバに分けた構成としている。
フロントサーバにはクライアントからリクエストを受け付けるアプリケーションを配置し、バックサーバにはバッチ処理を行うアプリケーションを配置する。


.. tabularcolumns:: |p{0.10\linewidth}|p{0.90\linewidth}|
.. list-table::
   :header-rows: 1
   :widths: 10 90

   * - 項番
     - 説明
   * - | (1)
     - | フロント側アプリケーションは、ユーザーのサービスレベルに応じた優先度でキューサービスにバッチ処理の実行要求メッセージの送信を振り分ける。
   * - | (2)
     - | 優先度が低いキューに割り振られた場合にバック側アプリケーションは、キューサービスからバッチ処理の実行要求メッセージを受信し、フロント側アプリケーションとは非同期に処理を実行する。
   * - | (3)
     - | 優先度が高いキューに割り振られた場合にバック側アプリケーションは、(2)よりも高い性能で同様の処理を実行する。


.. warning::

   処理するサーバ性能とキューイングされたメッセージ数のバランスにより、優先順位が低い方の処理が早く終るケースがある。
   そのため優先度が高いキューに多くの残ジョブ数が溜まる場合により早く捌くために、優先順位の低いキューと優先順位の高いキューの処理速度を監視してチューニング対象とすることが望ましい。


フロントサーバの処理方式
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

フロントサーバの処理方式については、共通編の
\ :ref:`asynchoronous-processing-front-label`\
を参照されたい。


バックサーバの処理方式
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

バックサーバの処理方式については、共通編の
\ :ref:`asynchoronous-processing-back-label`\
を参照されたい。


How to use
--------------------------------------------------------------------------------


メッセージングサービスの利用した優先順位の設定
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

クラウドベンダーが提供するメッセージングサービスを利用し、非同期処理(優先順位の設定)を実装する。

#. サービスレベルに応じたメッセージ送信
    * サービスレベルに応じた優先度のキューに実行要求メッセージを送信する機能を実装する。

#. サービスレベルに応じたメッセージ受信
    * サービスレベルに応じた優先度のキューから実行要求メッセージを受信する機能を実装する。


Amazon Web Service
""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""

クラウドベンダーとしてAWSを使用する場合の優先順位の設定の実装例については、
:doc:`../../AWSCollaboration/Queuing/PriorityQueue`
を参照されたい。


Appendix
--------------------------------------------------------------------------------



厳密な優先順位の制御
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
| 厳密な優先順位の制御とは、ある静止点のメッセージを必ず優先順位の高い順に処理する場合の方式である。
| ここでは、参考までに実現方式を紹介する。

.. figure:: ./imagesAsynchronousProcessing/StrictPriorityQueue.png
   :alt: Screen image of asynchronous processing.
   :width: 100%


.. tabularcolumns:: |p{0.10\linewidth}|p{0.90\linewidth}|
.. list-table::
   :header-rows: 1
   :widths: 10 90

   * - 項番
     - 説明
   * - | (1)
     - | 処理可能なメッセージ数の上限を優先度の高いキューより取得する。
   * - | (2)
     - | 取得済みのメッセージ数が上限に達していない場合に、上限までの残り数を優先度の低い方から取得する。
   * - | (3)
     - | 取得したメッセージを並列で処理する。
   * - | (4)
     - | メッセージ毎に、処理が完了した場合はキューから削除、失敗した場合はその旨通知を行いメッセージを再処理可能とする。

.. note::

   状況に因って優先度低のキューがいつまでも処理されない可能性があるため、要求に応じて優先度毎の処理割合を決めて制御するなどの工夫も必要となる。




.. raw:: latex

   \newpage