Mechanismus für Clientinvalidierung aktivieren

In einer verteilten Umgebung von WebSphere eXtreme Scale gibt es auf der Clientseite standardmäßig einen nahen Cache, wenn die optimistische Sperrstrategie verwendet wird oder Sperren inaktiviert sind. Der nahe Cache enthält seine eigenen lokalen zwischengespeicherten Daten. Wenn ein Client von eXtreme Scale eine Aktualisierung festschreibt, wird diese Aktualisierung an den nahen Cache des Clients und an den Server gesendet. Andere Clients von eXtreme Scale erhalten die Aktualisierungsinformationen jedoch nicht und können daraufhin Daten haben, die nicht auf dem neuesten Stand sind.

Naher Cache

Anwendungen müssen sich dieses Problems potenziell veralteter Daten in Clients von eXtreme Scale bewusst sein. Sie können die integrierte JMS-basierte (Java Message Service) ObjectGridEventListener-Klasse "com.ibm.websphere.objectgrid.plugins.builtins.JMSObjectGridEventListener" verwenden, um den Mechanismus für die Invalidierung von Clients in einer verteilten Umgebung von eXtreme Scale zu aktivieren.

Der Mechanismus für Clientinvalidierung ist die Lösung für das Problem veralteter Daten im nahen Cache des Clients in einer verteilten eXtreme-Scale-Umgebung. Diese Mechanismus stellt sicher, dass der nahe Cache des Clients mit Servern oder anderen Clients synchronisiert wird. Aber selbst mit diesem JMS-basierten Mechanismus für Clientinvalidierung wird der nahe Cache des Clients nicht sofort aktualisiert. Es tritt eine Verzögerung auf, wenn die Laufzeitumgebung Aktualisierungen veröffentlicht.

Es sind zwei Modelle für den Mechanismus für Clientinvalidierung in einer verteilten eXtreme-Scale-Umgebung verfügbar:
  • Client/Server-Modell: In diesem Modell haben alle Serverprozesse die Rolle "Publisher" (Bereitsteller), die alle Transaktionsänderungen an der vorgesehenen JMS-Destination veröffentlicht. Alle Clientprozesse haben die Rolle "Receiver" (Empfänger) und empfangen alle Transaktionsänderungen von der vorgesehenen JMS-Destination.
  • Modell mit dem Client in zwei Rollen: In diesem Modell haben alle Serverprozesse nichts mit der JMS-Destination zu tun. Alle Clientprozesse übernehmen die Rollen "Publisher" (Veröffentlichung) und "Receiver" (Empfang) für die JMS-Destinations. Transaktionsänderungen, die auf Clientseite stattfinden, werden an der JMS-Destination veröffentlicht, und alle Clients empfangen diese Transaktionsänderungen.

Weitere Informationen finden Sie im Abschnitt JMS-Ereignis-Listener.

Client/Server-Modell

In einem Client/Server-Modell haben die Server die Rolle "JMS-Publisher", und der Client hat die Rolle "JMS-Receiver".
XML-Beispiel für Client/Server-Modell
<?xml version="1.0" encoding="UTF-8"?>
<?xml version="1.0" encoding="UTF-8"?>
<objectGridConfig xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://ibm.com/ws/objectgrid/config ../objectGrid.xsd"
  xmlns="http://ibm.com/ws/objectgrid/config">
  <objectGrids>
    <objectGrid name="AgentObjectGrid">
      <bean id="ObjectGridEventListener"
        className="com.ibm.websphere.objectgrid.plugins.builtins.JMSObjectGridEventListener">
        <property name="invalidationModel" type="java.lang.String" value="CLIENT_SERVER_MODEL" description="" />
        <property name="invalidationStrategy" type="java.lang.String" value="PUSH" description="" />
        <property name="mapsToPublish" type="java.lang.String" value="agent;profile;pessimisticMap" description="" />
        <property name="jms_topicConnectionFactoryJndiName" type="java.lang.String" value="defaultTCF" description="" />
        <property name="jms_topicJndiName" type="java.lang.String" value="defaultTopic" description="" />
        <property name="jms_topicName" type="java.lang.String" value="defaultTopic" description="" />
        <property name="jms_userid" type="java.lang.String" value="" description="" />
        <property name="jms_password" type="java.lang.String" value="" description="" />
        <property name="jndi_properties" type="java.lang.String"
          	value="java.naming.factory.initial=org.apache.activemq.jndi.ActiveMQInitialContextFactory; 
					java.naming.provider.url= 
				tcp://localhost:61616;connectionFactoryNames=defaultTCF;topic.defaultTopic=defaultTopic"
          description="jndi properties" />
      </bean>

      <backingMap name="agent" readOnly="false" pluginCollectionRef="agent" preloadMode="false"
        lockStrategy="OPTIMISTIC" copyMode="COPY_ON_READ_AND_COMMIT" ttlEvictorType="LAST_ACCESS_TIME"
        timeToLive="28800" />
      <backingMap name="profile" readOnly="false" pluginCollectionRef="profile" preloadMode="false"
        lockStrategy="OPTIMISTIC" copyMode="COPY_ON_READ_AND_COMMIT" ttlEvictorType="LAST_ACCESS_TIME"
        timeToLive="2700" />
      <backingMap name="pessimisticMap" readOnly="false" pluginCollectionRef="pessimisticMap" preloadMode="false"
        lockStrategy="PESSIMISTIC" copyMode="COPY_ON_READ_AND_COMMIT" ttlEvictorType="LAST_ACCESS_TIME"
        timeToLive="2700" />
      <backingMap name="excludedMap1" readOnly="false" pluginCollectionRef="excludedMap1" preloadMode="false"
        lockStrategy="OPTIMISTIC" copyMode="COPY_ON_READ_AND_COMMIT" ttlEvictorType="LAST_ACCESS_TIME"
        timeToLive="2700" />
      <backingMap name="excludedMap2" readOnly="false" pluginCollectionRef="excludedMap2" preloadMode="false"
        lockStrategy="OPTIMISTIC" copyMode="COPY_ON_READ_AND_COMMIT" ttlEvictorType="LAST_ACCESS_TIME"
        timeToLive="2700" />
    </objectGrid>
  </objectGrids>

  <backingMapPluginCollections>
    <backingMapPluginCollection id="agent">
      <bean id="ObjectTransformer" className="com.ibm.ws.objectgrid.test.scenario.AgentObjectTransformer" />
    </backingMapPluginCollection>
    <backingMapPluginCollection id="profile">
      <bean id="ObjectTransformer" className="com.ibm.ws.objectgrid.test.scenario.ProfileObjectTransformer" />
      <bean id="Evictor" className="com.ibm.websphere.objectgrid.plugins.builtins.LRUEvictor">
        <property name="maxSize" type="int" value="2000" description="set max size for LRU evictor" />
        <property name="sleepTime" type="int" value="15" description="evictor thread sleep time" />
        <property name="numberOfLRUQueues" type="int" value="50" description="set number of LRU queues" />
      </bean>
    </backingMapPluginCollection>

    <backingMapPluginCollection id="pessimisticMap" />
    <backingMapPluginCollection id="excludedMap1" />
    <backingMapPluginCollection id="excludedMap2" />
  </backingMapPluginCollections>

</objectGridConfig>

Modell mit dem Client in zwei Rollen

In diesem Modell übernimmt jeder Client sowohl die Rolle "JMS-Publisher" als auch die Rolle "JMS-Receiver". Der Client veröffentlicht alle festgeschriebenen Transaktionsänderungen an der vorgesehenen JMS-Destination und empfängt alle festgeschriebenen Transaktionsänderungen von anderen Clients. Der Server selbst hat in diesem Modell nichts mit JMS zu tun.
XML-Beispiel mit Zweirollenmodell
<?xml version="1.0" encoding="UTF-8"?>
<objectGridConfig xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://ibm.com/ws/objectgrid/config ../objectGrid.xsd"
  xmlns="http://ibm.com/ws/objectgrid/config">
  <objectGrids>
    <objectGrid name="AgentObjectGrid">
      <bean id="ObjectGridEventListener"
        className="com.ibm.websphere.objectgrid.plugins.builtins.JMSObjectGridEventListener">
        <property name="invalidationModel" type="java.lang.String" value="CLIENT_AS_DUAL_ROLES_MODEL" description="" />
        <property name="invalidationStrategy" type="java.lang.String" value="PUSH" description="" />
        <property name="mapsToPublish" type="java.lang.String" value="agent;profile;pessimisticMap" description="" />
        <property name="jms_topicConnectionFactoryJndiName" type="java.lang.String" value="defaultTCF" description="" />
        <property name="jms_topicJndiName" type="java.lang.String" value="defaultTopic" description="" />
        <property name="jms_topicName" type="java.lang.String" value="defaultTopic" description="" />
        <property name="jms_userid" type="java.lang.String" value="" description="" />
        <property name="jms_password" type="java.lang.String" value="" description="" />
        <property name="jndi_properties" type="java.lang.String"
          value="java.naming.factory.initial=org.apache.activemq.jndi.ActiveMQInitialContextFactory;java.naming.provider.url=
				 tcp://localhost:61616;connectionFactoryNames=defaultTCF;topic.defaultTopic=defaultTopic"
          description="jndi properties" />
      </bean>

      <backingMap name="agent" readOnly="false" pluginCollectionRef="agent" preloadMode="false"
        lockStrategy="OPTIMISTIC" copyMode="COPY_ON_READ_AND_COMMIT" ttlEvictorType="LAST_ACCESS_TIME"
        timeToLive="28800" />
      <backingMap name="profile" readOnly="false" pluginCollectionRef="profile" preloadMode="false"
        lockStrategy="OPTIMISTIC" copyMode="COPY_ON_READ_AND_COMMIT" ttlEvictorType="LAST_ACCESS_TIME"
        timeToLive="2700" />
      <backingMap name="pessimisticMap" readOnly="false" pluginCollectionRef="pessimisticMap" preloadMode="false"
        lockStrategy="PESSIMISTIC" copyMode="COPY_ON_READ_AND_COMMIT" ttlEvictorType="LAST_ACCESS_TIME"
        timeToLive="2700" />
      <backingMap name="excludedMap1" readOnly="false" pluginCollectionRef="excludedMap1" preloadMode="false"
        lockStrategy="OPTIMISTIC" copyMode="COPY_ON_READ_AND_COMMIT" ttlEvictorType="LAST_ACCESS_TIME"
        timeToLive="2700" />
      <backingMap name="excludedMap2" readOnly="false" pluginCollectionRef="excludedMap2" preloadMode="false"
        lockStrategy="OPTIMISTIC" copyMode="COPY_ON_READ_AND_COMMIT" ttlEvictorType="LAST_ACCESS_TIME"
        timeToLive="2700" />
    </objectGrid>
  </objectGrids>

  <backingMapPluginCollections>
    <backingMapPluginCollection id="agent">
      <bean id="ObjectTransformer" className="com.ibm.ws.objectgrid.test.scenario.AgentObjectTransformer" />
    </backingMapPluginCollection>
    <backingMapPluginCollection id="profile">
      <bean id="ObjectTransformer" className="com.ibm.ws.objectgrid.test.scenario.ProfileObjectTransformer" />
      <bean id="Evictor" className="com.ibm.websphere.objectgrid.plugins.builtins.LRUEvictor">
        <property name="maxSize" type="int" value="2000" description="set max size for LRU evictor" />
        <property name="sleepTime" type="int" value="15" description="evictor thread sleep time" />
        <property name="numberOfLRUQueues" type="int" value="50" description="set number of LRU queues" />
      </bean>
    </backingMapPluginCollection>

    <backingMapPluginCollection id="pessimisticMap" />
    <backingMapPluginCollection id="excludedMap1" />
    <backingMapPluginCollection id="excludedMap2" />
  </backingMapPluginCollections>

</objectGridConfig>