Schrittweise Anleitung für eine Beispielanwendung und Einführung in die Cache-Diagnose
Lernziele
Nachdem Sie diese Lektion abgeschlossen haben, sind Sie in der Lage, die folgenden Aufgaben auszuführen:
- Erläutern eines Musters für die Speicherung und Aktualisierung im Cache zwischengespeicherter Daten
- Bestimmen der für den zwischengespeicherten Wert zu verwendenden Datenstruktur
- Diagnose der Cache-Nutzung
Schrittweise Anleitung für eine Beispielanwendung
Werfen wir einen Blick auf eine Beispielanwendung, die veranschaulicht, wie der Organisations-Cache zum Speichern und Abrufen von Wechselkursen verwendet wird. Wechselkurse schwanken im Verlauf eines Tages, sodass diese Beispielanwendung keine Echtzeitkurse liefert. Die Anwendung bietet lediglich eine tägliche Momentaufnahme von Wechselkursen. Da wir nicht an genauen Echtzeitwerten interessiert sind, sondern nur an Tageswerten, ist das Zwischenspeichern der Wechselkurse im Cache eine gute Wahl. Wenn Wechselkurse wiederholt abgerufen werden, spart das Abrufen aus dem Cache viel Zeit und verbessert die Leistung der Anwendung.
Übersicht über die Beispielanwendung
Unsere Beispielanwendung für Wechselkurse basiert auf einer Visualforce-Seite und einem Apex-Steuerfeld, das die Logik zum Abrufen von Wechselkursen enthält. Beim ersten Zugriff auf diese Seite werden die Kurse über einen API-Aufruf eines externen Webservice ermittelt. Nachfolgende Ausführungen dieser Seite geben die Kurse aus dem Cache zurück, solange die Kurse weniger als einen Tag alt sind. Für jeden Wechselkurs werden auf dieser Seite die Ausgangswährung, die Zielwährung für die Umrechnung und der Umrechnungskurs angezeigt. Zur Veranschaulichung wird eine kleine Menge von Währungen zurückgegeben.
Dieses Beispiel ist das Markup der Visualforce-Seite. Diese Seite ist mit dem Apex-Steuerfeld ExchangeRates verknüpft.
<apex:page controller="ExchangeRates" action="{!init}"> <apex:pageBlock title="Rates"> <apex:pageBlockTable value="{!Rates}" var="rate"> <apex:column value="{!rate.Base_Currency__c}"/> <apex:column value="{!rate.To_Currency__c}"/> <apex:column value="{!rate.Rate__c }"/> </apex:pageBlockTable> </apex:pageBlock> </apex:page>
Beispiel eines Apex-Steuerfelds
Unser Apex-Beispielsteuerfeld übernimmt die wichtigsten Aufgaben. Es dient zum Abrufen von Wechselkursen, deren Speicherung in Salesforce und im Cache sowie zum Abrufen von Kursen aus dem Cache. Hier ist eine Aufschlüsselung der Vorgänge, die das Beispielsteuerfeld durchführt, gefolgt vom Quellcode.
Beim ersten Ausführen des Beispiels finden die folgenden Vorgänge statt.
- Die Wechselkurse werden über einen API-Aufruf an einen externen Endpunkt ermittelt.
- Das vom API-Aufruf (im JSON-Format) zurückgegebene Ergebnis wird analysiert und in sObjects des Typs "Exchange_Rate__c" in Salesforce gespeichert.
- Die getCachedRates()-Methode speichert das Array von sObjects des Typs Exchange_Rate__c im Organisations-Cache.
Dies erfolgt bei nachfolgenden Ausführungen des Beispiels:
- Das Beispiel prüft, wie aktuell die gespeicherten Daten sind. Zu diesem Zweck erfolgt eine SOQL-Abfrage, um den Wert createdDate des ersten zurückgegebenen Exchange_Rate__c-Datensatzes abzurufen.
- Wenn das Datum älter als ein Tag ist, werden die Wechselkurse wie bei der ersten Ausführung über den API-Aufruf abgerufen.
- Ist das Datum jünger als ein Tag, werden die Kurse aus dem Organisations-Cache ausgelesen. Bei einem Cache-Fehlzugriff werden die Kurse aus sObjects des Typs "Exchange_Rate__c " abgefragt und im Organisations-Cache gespeichert.
public class ExchangeRates { private String currencies = 'EUR,GBP,CAD,PLN,INR,AUD,SGD,CHF,MYR,JPY,CNY'; public String getCurrencies() { return currencies;} public Exchange_Rate__c[] rates {get; set;} // // Checks if the data is old and gets new data from an external web service // through a callout. Calls getCachedRates() to manage the cache. // public void init() { // Let's query the latest data from Salesforce Exchange_Rate__c[] latestRecords = ([SELECT CreatedDate FROM Exchange_Rate__c WHERE Base_Currency__c =:RateLib.baseCurrencies AND forList__c = true ORDER BY CreatedDate DESC LIMIT 1]); // If what we have in Salesforce is old, get fresh data from the API if ( latestRecords == null || latestRecords.size() == 0 || latestRecords[0].CreatedDate.date() < Datetime.now().date()) { // Do API request and parse value out String tempString = RateLib.getLoadRate(currencies); Map<String, String> apiStrings = RateLib.getParseValues( tempString, currencies); // Let's store the data in Salesforce RateLib.saveRates(apiStrings); // Remove the cache key so it gets refreshed in getCachedRates() Cache.Org.remove('Rates'); } // Call method to manage the cache rates = getCachedRates(); } // // Main method for managing the org cache. // - Returns exchange rates (Rates key) from the org cache. // - Checks for a cache miss. // - If there is a cache miss, returns exchange rates from Salesforce // through a SOQL query, and updates the cached value. // public Exchange_Rate__c[] getCachedRates() { // Get the cached value for key named Rates Exchange_Rate__c[] rates = (Exchange_Rate__c[])Cache.Org.get( RateLib.cacheName+'Rates'); // Is it a cache miss? if(rates == null) { // There was a cache miss so get the data via SOQL rates = [SELECT Id, Base_Currency__c, To_Currency__c, Rate__c FROM Exchange_Rate__c WHERE Base_Currency__c =:RateLib.baseCurrencies AND forList__c = true AND CreatedDate = TODAY]; // Reload the cache Cache.Org.put(RateLib.cacheName+'Rates', rates); } return rates; } }
Im Abschnitt "Ressourcen" können Sie den Quellcode des Beispiels für Wechselkurse herunterladen und mit ihm in Ihrer Developer Edition-Organisation experimentieren.
Bewährte Vorgehensweisen bei der Cache-Verwaltung
Muster für die Cache-Speicherung
Die Apex-Klasse ExchangeRates enthält Methoden, die die Logik der Initialisierung und Aktualisierung des Caches kapseln. Wenn die Daten veraltet sind oder nicht gefunden werden, ruft die init()-Methode neue Wechselkurse über einen API-Aufruf ab und speichert sie dann in Salesforce. Mit der getCachedRates()-Methode wird der Cache intern verwaltet. Wenn der zwischengespeicherte Wert nicht gefunden wird, ruft diese Methode ein Array von Kursen aus Salesforce ab und speichert es im Cache.
Da unsere Anwendung externe Daten verwendet, ruft sie über API-Aufrufe Daten von einem Webservice ab. Außerdem werden die Daten als Salesforce-Datensätze als Ersatz für die Aktualisierung des Caches gespeichert. Anwendungen, die keine externen Daten verwenden, rufen Salesforce-Datensätze mithilfe von SOQL ab und speichern sie im Cache. In diesem Fall ist die Cache-Verwaltung einfacher und die Implementierung der Cache-Methoden schneller. Falls Ihre Anwendung beispielsweise nur lokale Daten aus SOQL verwendet, benötigen Sie nicht die init()-Methode, sondern nur die getCachedRates()-Methode.
Wir empfehlen, die gesamte Logik zur Verwaltung des Caches in einer Methode zusammenzufassen. Auf diese Weise wird der Cache nur an einer Stelle in Ihrer Anwendung bearbeitet. Die zentrale Verwaltung des Caches reduziert das Risiko von Fehlzugriffen auf den Cache oder eines versehentlichen Überschreibens von Cache-Werten.
Entscheiden, was im Cache zwischengespeichert werden soll
Dieses Beispiel speichert ein Array von sObjects im Cache. Ist dieser Ansatz für die zu speichernden Datenstruktur am besten? Bei jeder Wahl, die Sie treffen, sind Kompromisse einzugehen. Das Speichern kleinerer Daten, wie z. B. von Feldwerten anstelle ganzer sObjects, kann den Umfang der Cache-Nutzung verringern. Wenn Sie jedoch weniger Daten in jedem Schlüssel speichern, benötigen Sie möglicherweise komplexe Logik, um die Daten und sObjects neu zu erstellen, was mehr Verarbeitungszeit erfordert. Und ein in einem Schlüssel gespeichertes sObject-Array belegt weniger Cache-Speicherplatz als die Gesamtgröße der in einzelnen Schlüsseln gespeicherten sObjects. Durch das Zwischenspeichern kleinerer Elemente anstelle einer Liste von Elementen verschlechtert sich die Cache-Leistung aufgrund des Aufwands für Serialisierung und der nötigen Zeit für den Commit im Cache. Anstatt beispielsweise eine Liste von Wechselkursen zu speichern (auf die von der Variablen "rates" in diesem Codeausschnitt verwiesen wird):
Cache.Org.put('Rates', rates);
Können Sie die einzelnen Wechselkurse, jeweils als Feld mit eigenem Cache-Schlüssel, wie folgt speichern.
Cache.Org.put('DollarToEuroRate', rateEUR); Cache.Org.put('DollarToChineseYuan', rateCNY); Cache.Org.put('DollarToJapaneseYen', rateJPY); // etc.
Die Entscheidung, welche Datenstruktur zwischengespeichert werden soll, hängt davon ab, was Ihre Anwendung mit den Daten macht. Wenn die Anwendung beispielsweise Währungen für dieselbe Basiswährung umrechnet, speichern Sie mindestens den Wechselkurs jeder Zielwährung. Sie können jeden Währungskurs als eigenen Schlüssel speichern. Um die Anzeige der Wechselkurse auf einer Visualforce-Seite zu vereinfachen, speichern Sie die Daten als Liste von sObjects im Cache. sObjects können mehr Speicherplatz beanspruchen, da sie Systemfelder wie das Erstellungsdatum enthalten, reduzieren aber die logische Verarbeitungszeit und erhöhen die Anwendungs- und Cache-Leistung. Denken Sie daran, dass das Hauptziel bei der Verwendung des Caches die Beschleunigung der Anwendungsausführung ist.
Diagnose der Cache-Nutzung
Sie haben alle für die Implementierung von Plattform-Cache erforderlichen Aufgaben erledigt. Doch woher wissen Sie, ob Sie den Cache optimal nutzen? Es gibt verschiedene Möglichkeiten zur Überprüfung von Leistungsdaten. Eine Möglichkeit besteht darin, die Diagnosedaten in Setup anzuzeigen (nur in Salesforce Classic verfügbar).
Bevor Sie die Diagnoseseite aufrufen, aktivieren Sie für Ihren Benutzer die Cache-Diagnoseberechtigung.
- Geben Sie in Setup im Feld "Schnellsuche" den Text "Benutzer" ein und wählen Sie dann Benutzer aus.
- Klicken Sie auf Ihren Benutzernamen und dann auf Bearbeiten.
- Wählen Sie Cache-Diagnose aus und klicken Sie dann auf Speichern.
Rufen Sie anschließend die Diagnoseseite für einen bestimmten Cache-Typ in einer Partition auf.
- Geben Sie in Setup im Feld "Schnellsuche" den Text "Cache" ein und wählen Sie dann Plattform-Cache aus.
- Klicken Sie auf die Partition, deren Diagnosedaten Sie überprüfen möchten.
- Klicken Sie unter "Session Cache (Sitzungs-Cache)" oder "Org Cache (Organisations-Cache)" auf Diagnostics (Diagnose).
Wenn Sie für den Organisations-Cache auf Diagnose klicken, wird die Seite "Organisations-Cache-Diagnose" auf einer neuen Registerkarte geöffnet. Diese Seite enthält zwei Diagramme. Das erste (Org Cache Capacity and Usage [Organisations-Cache-Kapazität und -Auslastung]) zeigt den Grenzwert Ihrer Cache-Nutzung. In unserem Fall liegen wir mit 0,02% weit unter dem Grenzwert. Das zweite (By Content Contribution [Nach Inhaltsbeitrag]) ist ein Ringdiagramm mit der Cache-Verteilung nach Schlüssel.
Die folgende Abbildung zeigt ein Inhaltsverteilungsdiagramm mit vier Cache-Schlüsseln. Einer der Cache-Schlüssel, Rates, wird in unserem Wechselkursbeispiel verwendet. Der Schlüssel Rates belegt mehr als die Hälfte des Speicherplatzes.
Auf die Diagramme folgen Details zu den Cache-Schlüsseln. Diese Liste gibt die Größe jedes zwischengespeicherten Werts an, der einem Schlüssel entspricht, und die Anzahl der Zugriffe auf den Cache. Als Alternative zum Aufrufen der remove()-Methode in Apex können Sie einen Cache manuell aus dieser Liste löschen. Mithilfe der Schaltfläche Löschen können Administratoren den Cache verwalten, ohne den Code zu ändern.
Der Schlüssel DollarToEuroRate belegt deutlich weniger Speicherplatz als der Schlüssel Rates. Das ist zu erwarten, denn der Schlüssel DollarToEuroRate speichert nur einen Wert, während Rates ein Array von sObjects speichert.
Bestimmen Sie anhand der Informationen auf der Diagnoseseite, ob Ihre Cache-Nutzung angepasst werden sollte. Wenn z. B. ein Cache-Wert eine niedrige Anzahl von Zugriffen aufweist, was bedeutet, dass er selten verwendet wird, überlegen Sie, ob er wirklich benötigt wird, besonders wenn er groß ist. Oder wenn Sie sich dem Grenzwert für die Cache-Nutzung nähern, überlegen Sie erneut, was Sie zwischenspeichern sollten. Sie können unnötige Cache-Werte entfernen oder mehr Cache-Kapazität erwerben.
Herzlichen Glückwunsch! Sie haben gelernt, wie Sie Plattform-Cache verwenden, um die Daten Ihrer Anwendung für einen schnellen Abruf zwischenzuspeichern. Außerdem haben Sie sich mit den besten Cache-Verfahren und der Diagnose der Cache-Nutzung vertraut gemacht. Sie sind jetzt bereit, an den Abenteuern des Eichhörnchens teilzunehmen und wertvolle Ressourcen zwischenzuspeichern!