Mise en cache aux frontières

La mise en cache aux frontières est une méthode simple et efficace pour améliorer les performances de votre système. La mémoire cache dynamique WebSphere Application Server possède des fonctions intégrées qui permettent, lorsque l'on affecte la valeur "true" à la propriété EdgeCacheable d'une entrée de cache, de la mettre en mémoire cache aux frontières. Cette propriété gère l'ESI à votre place, ce qui facilite la mise en cache aux frontières avec pratiquement aucune configuration.

Remarque : Vous pouvez utiliser la mise en cache Edge pour les magasins qui s'exécutent sur le serveur de transactions (magasins migrés des versions précédentes de HCL Commerce). Pour les magasins qui s'exécutent sur le serveur de magasin, la fonctionnalité de mise en cache du serveur Edge n'est pas disponible.

Le filtre de servlet de cache crée des attributs de requête avec des informations de session utilisées par la mémoire cache DynaCache de WebSphere Application Server pour générer l'ID de cache, l'ID de dépendance et l'ID d'invalidation. Les attributs de requêtes de session ne peuvent pas être utilisés pour générer l'ID de cache si l'utilisateur souhaite mettre en cache le servlet ou JavaServerPage (le fichier JSP) en dehors du serveur d'applications. Concernant la mise en cache de serveur Web ou de serveur d'équilibrage des charges, seuls les paramètres URL ou les cookies peuvent être utilisés comme ID de cache. Pour permettre la mise en cache des pages de magasin HCL Commerce, les informations de session sont placées dans des cookies de session.

Le contenu des pages de magasin est basé sur les informations de session utilisateur. Pour permettre la mise en cache de ces pages de magasin, les informations de session sont requises comme partie intégrante de l'ID de cache. Par défaut, les informations de session (ID de langue, ID de devise préférée, organisation parent, ID de contrat et groupe de membres) sont configurées en tant qu'attributs de requête par le filtre de cache. Pour pouvoir être mises en cache en dehors du serveur d'applications, ces informations sont stockées sous forme de cookies de session basés sur les paramètres de configuration du fichier instanceName.xml. Ces attributs peuvent être renommés, ajoutés ou supprimés dans wc-server.xml.

Edge Side Include (ESI) est un langage de balisage simple utilisable pour définir des composants de page Web en vue de l'assemblage dynamique et de l'affichage d'applications Web aux frontières sur Internet.

La mémoire cache du processeur ESI peut être contrôlée via l'application du moniteur de cache. Pour que la mémoire cache du processeur ESI soit visible dans le moniteur de cache (pour plus d'informations, reportez-vous à la section sur le moniteur de cache dynamique), il faut que l'application DynaCacheEsi soit installée comme indiqué ci-dessus et que la propriété esiInvalidationMonitor ait pour valeur "true" dans le fichier plugin-cfg.xml.

Exemple :
<?xml version-"1.0"?>
<Config>
        <Property Name="esiEnable" Value="true"/>
        <Property Name="esiMaxCacheSize" Value="1024"  
        <Property Name="esiInvalidationMonitor"
Value="true"/>

Activation de la génération de cookies de frontière dans wc-server.xml

Le contenu des pages de magasin de HCL Commerce est généré d'après les informations de session utilisateur. Pour permettre la mise en cache de ces pages de magasin, les informations de session sont requises comme partie intégrante des ID de cache. Actuellement, les informations de session (ID de contrat acheteur et groupe de membres) sont configurées en tant qu'attributs de requête par le filtre de cache. Les informations de session sont configurées sous forme de cookies de session basés sur les paramètres de configuration du fichier wc-server.xml.

Vous pouvez activer des cookies en donnant la valeur true à l'attribut enable dans le composant suivant :

<component
       
compClassName="com.ibm.commerce.dynacache.filter.EdgeCacheCookieHelper"
        enable="
true" name="DynaCacheCookie">
        <property
                CookieDomain=""
                CookiePath="/"
                MutipleStores="true"
                Timeout="3600" display="false">
                <ec name="memberGroups" value="true"/>
                <ec name="buyerContractIds" value="true"/>
        </property>
</component>
En modifiant l'attribut value du composant ci-dessus, vous pouvez sélectionner lesquels des cookies suivants sont à activer ou désactiver :
  • WCDC_CACHEID2 (memberGroups)
  • WCDC_CACHEID3 (buyerContractIds)

Activation de la prise en charge des cookies

Etant donné qu'il est possible de mettre en cache à l'extérieur de WebSphere Application Server, il est possible d'offrir une mise en cache pour chaque magasin. Dans cachespec.xml, l'entrée de cache de magasin multiple inclut l'ID de magasin dans l'ID de composant. En outre, des entrées cache-id sont générées pour chaque magasin.

Vous pouvez utiliser la mise en cache Edge comme suit :

  • avec un seul magasin
  • avec plusieurs magasins

Le programme d'écoute d'événement de la cache dynamique (DynaCache) se met à l'écoute des événements de modification de session déclenchés par l'userId ou l'storeId, puis exécute les actions suivantes :

  • Suppression de tous les anciens cookies de session (le cas échéant)
  • Création de nouveaux cookies de session en fonction des paramètres de l'objet com.ibm.commerce.dynacache.DynaCacheCookie et des données obtenues à partir de la structure de catalogue de base
  • Affectation à chaque cookie d'un délai d'expiration d'un jour
  • Hachage de chaque cookie à l'aide de la valeur de hachage unilatéral valeur + clé de commerçant + date du jour (aaaammjj)
  1. Pour utiliser la mise en cache Edge afin de mettre en cache des pages hors de WebSphere Application Server, la propriété esiEnable doit être définie sur true. Vérifiez que la propriété esiEnable est bien définie sur true.

    Vous pouvez configurer le processeur ESI via le fichier de configuration du plug-in du serveur Web WebSphere, plugin-cfg.xml, qui se trouve dans le répertoire WAS_installdir/config/cells/. Par exemple :

    
    <Property Name="esiEnable" Value="true"/>
    
  2. Ouvrez le fichier cachespec.xml situé dans le répertoire WEB-INF des archives WAR (Web application archive) ou des beans d'entreprise.
  3. Ajoutez une propriété au fichier cachespec.xmlpermettant d'activer la mise en cache Edge.
    
    <property name="EdgeCacheable">true</property>
    
  4. Exécutez l'une des étapes suivantes :
    • Scénario à un seul magasin :
      1. Ajoutez les entrées de composant suivantes au fichier cachespec.xml à l'intérieur d'une balise <cache-entry>.
        <component id="Component ID" type="cookie">
                <required>true</required>
        </component>
        
        ID de composant Définition
        WCDC_CACHEID2 Groupes de membres
        WCDC_CACHEID3 ID contrat acheteur
    • Scénario à plusieurs magasins :
      1. Insérez une entrée <cache-id> pour chaque magasin dans le fichier cachespec.xml avec la structure et les propriétés suivantes.
        
        <!-- StoreCatalogDisplay?storeId=10001 -->
        <cache-id>
        <component id="" type="pathinfo">
                <required>true</required>
                <value>/StoreCatalogDisplay</value>
        </component>
        <component id="storeId" type="parameter">
                <required>true</required>
                <value>10001</value>
        </component>
        <component id="catalogId" type="parameter">
                <required>true</required>
        </component>
        <component id="WC_LANGID_10001" type="cookie">
                <required>true</required>
        </component>
        <component id="WC_CACHEID5_10001" type="cookie">
                <required>true</required>
        </component>
        </cache-id>
        
        <!-- StoreCatalogDisplay?storeId=10002 -->
        <cache-id>
        <component id="" type="pathinfo">
                <required>true</required>
                <value>/StoreCatalogDisplay</value>
        </component>
                <component id="storeId" type="parameter">
                <required>false</required>
        <value>10002</value>
        </component>
        <component id="catalogId" type="parameter">
                <required>true</required>
        </component>
        <component id="WC_LANGID_10002" type="cookie">
                <required>true</required>
        </component>
        <component id="WC_CACHEID5_10002" type="cookie">
                <required>true</required>
        </component>
        </cache-id>
        

        Au moment de l'exécution, le générateur de cookies génère dynamiquement un cookie nommé d'après ce storeId. Par exemple, pour le storeId anglais 10001, le cookie WC_LANGID_10001=-1 est généré.

Mise en cache de données statiques

Par défaut, les données statiques telles que les images et les fichiers HTML sont mises en cache par le processeur ESI lorsqu'elles sont diffusées par WebSphere Application Server. Les entrées en cache possèdent un délai d'attente par défaut de 300 secondes. Cette valeur peut être modifiée en définissant la propriété système com.ibm.servlet.file.esi.timeOut sur votre machine virtuelle.

Par exemple : -D com.ibm.servlet.file.esi.timeOut=60

Par défaut, HCL Commerce ne met pas en cache de données statiques. Vous pouvez activer cette mise en cache en spécifiant un élément cache-entry dans le fichier cachespec.xml. Pour plus d'informations, reportez-vous à la section relative au servlet de fichier simple.

Mise en cache de pages complètes à l'aide d'ESI

Pour marquer une entrée comme devant être mise en cache à l'aide d'ESI, utilisez la propriété EdgeCacheable. Cette propriété implique également la propriété consume-subfragments. La page sera alors mise en cache sous forme de page complète en incluant tous ses sous-fragments sauf si l'un de ces sous-fragments est défini comme devant être mis en cache séparément (pour plus d'informations, reportez-vous à la section relative à la mise en cache de fragments à l'aide d'ESI). Les pages mises en cache à l'aide d'ESI définissent l'ID de cache via des composants de type paramètre et cookie. Vous ne pouvez pas utiliser des attributs de requête dans la définition des ID de cache car ils ne sont pas disponibles aux frontières du réseau.

L'exemple suivant contient un élément cache-entry utilisant le plug-in ESI :


<cache-entry>
        <class>servlet</class>
       
<name>strutsname</name>
        <property name="store-cookies">false</property>
        <property
name="save-attributes">false</property>
        <property name="EdgeCacheable">true</property>
strutsname est com.ibm.commerce.struts.ECActionServlet.class (pour HCL Commerce version 9.0.0.x) ou com.ibm.commerce.struts.v2.ECActionServlet.class pour la version 9.0.x.

   <cache-id>
                <component id="" type="pathinfo">
                        <required>true</required>      
            
                       
<value>/StoreCatalogDisplay</value>
                </component>
                <component id="storeId" type="parameter">
                        <required>true</required>
                </component>
                <component id="catalogId" type="parameter">
                        <required>true</required>
                </component>
        </cache-id>
</cache-entry>

Fragments avec ESI

HCL Commerce utilise comme modèle de programmation l'architecture MVC (model-view-controller), dans laquelle les appels à un servlet se contrôle peuvent inclure un ou plusieurs fichiers JSP enfants pour construire la vue. Pour que les fichiers JSP enfant puissent être mis en cache à la frontière, ils doivent pouvoir effectuer une requête externe sur ces fichiers JSP. Le processeur ESI nécessite que les fragments qui peuvent être placées aux frontières puissent faire l'objet d'une requête externe sur la frontière. Par exemple, les fragments ne doivent pas dépendre d'informations définies par leur parent et d'autres fragments de la même requête. Chaque fragment est renvoyé via le servlet du contrôleur à l'aide de la propriété alternate_url définie dans la stratégie de mise en cache. Si les fragments dépendent d'un attribut de requête défini par leur parent, ils ne s'exécutent pas. La solution palliative consiste à calculer la valeur de l'attribut à l'aide d'un filtre de servlet personnalisé qui s'exécute sur alternate_url.

Dans les pages de produit communes, la barre d'options latérale inclut de façon dynamique un fragment (MiniCartDisplay.jsp) qui affiche un mini panier personnalisé.

Pour pouvoir mettre en cache cette page de produit et ce mini panier aux frontières, vous devez générer des règles d'ID de cache qui contiennent uniquement des paramètres URL ou des cookies. Concernant la page de produit, elle ne constitue pas un problème car toutes les informations nécessaires à sa mise en cache sont dans l'URL. Cependant, étant donné que le mini panier est unique pour chaque utilisateur, pour pouvoir le mettre en cache aux frontières, vous devez utiliser l'ID utilisateur comme ID de cache.

Etant donné que seuls les paramètres URL et les cookies peuvent être utilisés pour définir la règle d'ID de cache et que l'URL ne peut pas contenir les informations utilisateur, le seul autre moyen de procéder est d'utiliser un cookie personnalisé contenant les informations d'ID utilisateur comme ID de cache. Utilisez le chaînage du filtre de servlet pour effectuer une chaîne avec le filtre de cache HCL Commerce afin de créer un cookie personnalisé appelé WCDC_USERID basé sur l'attribut de requête DC_userId créé par le filtre de cache.

Voici un exemple de cachespec.xml :


<cache-entry>
        <class>servlet</class>
        <name>/ToolTech/include/MiniShopCart.jsp</name>
        <property name="EdgeCacheable">true</property>
        <property
name="alternate_url">/servlet/ToolTech/include/MiniShopCart.jsp</property>
        <property
name="save-attributes">false</property>
        <property
name="do-not-consume">false</property>
        <cache-id>
                <component id="WCDC_USERID" type="cookie">
                        <required>true</required>
                </component>
        </cache-id>
</cache-entry>

<cache-entry>
        <class>servlet</class>
       
<name>strutsname</name>
        <property name="store-cookies">false</property>
        <property
name="save-attributes">false</property>
        <property name="EdgeCacheable">true</property>
        <cache-id>
                <component id="" type="pathinfo">
                        <required>true</required>
                       
<value>/TopCategoriesDisplay</value>
                </component>
                <component id="storeId" type="parameter">
                        <required>true</required>
                </component>
                <component id="catalogId" type="parameter">
                        <required>true</required>
                </component>
        </cache-id>
</cache-entry>
strutsname est com.ibm.commerce.struts.ECActionServlet.class (pour HCL Commerce version 9.0.0.x) ou com.ibm.commerce.struts.v2.ECActionServlet.class (pour la version 9.0.x).