Optimisation des performances de sérialisation

WebSphere eXtreme Scale utilise plusieurs processus Java pour héberger les données. Ces processus sérialisent les données, c'est-à-dire les convertissent (sous la forme d'instances d'objets Java) en octets, puis si nécessaire de nouveau en objets pour permettre le déplacement des données entre les processus client et serveur. La conversion des paramètres de données est l'opération la plus coûteuse et doit être effectuée par le développeur d'applications lors de la conception du schéma, la configuration de la grille et l'interaction avec les API d'accès aux données.

La sérialisation Java par défaut et les routines de copie sont relativement lentes et peuvent consommer 60 à 70 % de la capacité du processeur dans une configuration classique. Les sections ci-dessous présentent des options d'amélioration des performances de la sérialisation.

Deprecated feature L'interface ObjectTransformer a été remplacée par les plug-in DataSerializer que vous pouvez utiliser pour stocker efficacement les données arbitraires dans WebSphere eXtreme Scale pour que les API de produit existantes puissent interagir efficacement avec vos données.

Ecriture d'un ObjectTransformer pour chaque mappe de sauvegarde

Un ObjectTransformer peut être associé à une mappe de sauvegarde. Votre application peut comporter une classe qui implémente l'interface ObjectTransformer et offre des implémentations pour les opérations suivantes :
  • Copie des valeurs
  • Sérialisation et inflation des clés vers et à partir des flux
  • Sérialisation et inflation des valeurs vers et à partir des flux

L'application ne doit pas copier des clés car celles-ci sont considérées comme étant non modifiables.

Remarque : L'interface ObjectTransformer est uniquement appelée lorsque la grille d'objets connaît les données en cours de transformation. Par exemple, les agents de l'API DataGrid sont utilisés, les agents et les données d'instance des agents ou les données renvoyées par l'agent doivent être optimisées à l'aide de techniques de sérialisation personnalisées. L'interface ObjectTransformer n'est pas appelée pour les agent de l'API DataGrid.

Utilisation d'entités

Lors de l'utilisation de l'API EntityManager avec les entités, la grille ne stocke pas les objets d'entité directement dans les mappes de sauvegarde. L'API EntityManager convertit l'objet d'entité en objets de bloc de données. Les mappes d'entité sont automatiquement associées à un ObjectTransformer hautement optimisé. Dès que l'API ObjectMap ou EntityManager est utilisée pour interagir avec les mappes d'entité, l'entité ObjectTransformer est appelée.

Sérialisation personnalisée

Dans certains cas, des objets doivent être modifiés pour utiliser la sérialisation personnalisée, telle que pour l'implémentation de l'interface java.io.Externalizable ou en implémentant des méthodes writeObject et readObject pour les classes qui mettent en oeuvre l'interface java.io.Serializable. Les techniques de sérialisation personnalisée doivent être employées lorsque les objets sont sérialisés à l'aide de mécanismes autres que les méthodes de l'API ObjectGrid ou EntityManager.

Par exemple, lorsque les objets ou entités sont stockés en tant que données d'instance dans un agent d'API DataGrid ou lorsque l'agent renvoie des objets ou des entités, ces objets ne sont transformés à l'aide d'un ObjectTransformer. Toutefois, l'agent fait automatiquement appel à l'ObjectTransformer lors de l'utilisation de l'interface EntityMixin. Pour plus de détails, voir Agents DataGrid et mappes basées sur les entités.

Tableaux d'octets

Lorsque vous utilisez l'API ObjectMap ou DataGrid, les objets key et value sont sérialisés lorsque le client interagit avec la grille de données et que les objets sont répliqués. Pour limiter les frais liés à la sérialisation, utilisez des tableaux d'octets et non les objets Java. Le stockage en mémoire des tableaux d'octets revient nettement moins cher car le kit JDK doit rechercher moins d'objets lors de la récupération de place et les tableaux d'octets peuvent être agrandis à la demande. Les tableaux d'octets doivent être uniquement utilisés si vous ne devez pas accéder aux objets utilisant des requêtes ou des index. Les données étant stockées sous la forme d'octets, leur accès n'est autorisé qu'avec la clé correspondante.

WebSphere eXtreme Scale peut automatiquement stocker les données sous la forme de tableaux d'octets à l'aide l'option de configuration de mappes CopyMode.COPY_TO_BYTES ou ce mode de stockage peut être traité manuellement par le client. Cette option permet de stocker les données en mémoire de façon efficace et peut, à la demande, agrandir automatiquement les objets au sein du tableau d'octets pour une utilisation des requêtes et des index.

Un plug-in MapSerializerPlugin peut être associé à un plug-in BackingMap lorsque vous utilisez le mode de copie COPY_TO_BYTES ou COPY_TO_BYTES_RAW. Cette association permet de stocker les données dans le format sérialisé en mémoire et non pas dans le format d'objet Java natif. Le stockage des données sérialisées permet d'économiser la mémoire et améliore la réplication et les performances sur le client et le serveur. Vous pouvez utiliser un plug-in DataSerializer pour développer des flux de sérialisation haute performance qui peuvent être compressés, chiffrés, améliorés et interrogés.