Zmienianie poziomów współużytkowania pamięci podręcznej dla działań wysyłania

SendMessageChannelCache Rozszerzenie umożliwia dostosowanie poziomów udostępniania pamięci podręcznej, ustawień pamięci podręcznej fabryki kanału oraz ustawień pamięci podręcznej kanału dla przepływów pracy, które wysyłają komunikaty do punktów końcowych usługi przy użyciu Send działań obsługi komunikatów. Te przepływy pracy są zwykle przepływy pracy klienta, ale mogą być również usługi przepływu pracy, które znajdują się w WorkflowServiceHost. Pamięć podręczna fabryki kanałów zawiera buforowane ChannelFactory<TChannel> obiekty. Pamięć podręczna kanału zawiera buforowane kanały.

Uwaga

Przepływy pracy mogą używać Send działań obsługi komunikatów do wysyłania komunikatów lub parametrów. Środowisko uruchomieniowe przepływu pracy dodaje fabryki kanałów do pamięci podręcznej, które tworzą kanały typu IRequestChannel podczas używania działania z działaniemSend, oraz IOutputChannel gdy tylko używasz ReceiveReplySend działania (bez ReceiveReply).

Poziomy udostępniania pamięci podręcznej

Domyślnie w przepływie pracy hostowanym przez pamięć podręczną używaną WorkflowServiceHost przez Send działania obsługi komunikatów są współużytkowane we wszystkich wystąpieniach przepływu pracy w WorkflowServiceHost buforowaniu na poziomie hosta. Klient przepływu pracy, który nie jest obsługiwany przez WorkflowServiceHost, pamięci podręcznej jest dostępna tylko dla wystąpienia przepływu pracy (buforowanie poziomie wystąpienia). Pamięć podręczna jest dostępna tylko dla Send działań, które nie używają punktów końcowych zdefiniowanych w konfiguracji, chyba że włączono niebezpieczne buforowanie.

Poniżej przedstawiono różne poziomy udostępniania pamięci podręcznej dostępne dla Send działań w przepływie pracy i ich zalecane użycie:

  • Poziom hosta: na poziomie udostępniania hosta pamięć podręczna jest dostępna tylko dla wystąpień przepływu pracy hostowanych na hoście usługi przepływu pracy. Pamięć podręczną można również udostępniać między hostami usługi przepływu pracy w pamięci podręcznej obejmującej cały proces.

  • Poziom wystąpienia: na poziomie udostępniania wystąpienia pamięć podręczna jest dostępna dla określonego wystąpienia przepływu pracy przez cały okres istnienia, ale pamięć podręczna nie jest dostępna dla innych wystąpień przepływu pracy.

  • Brak pamięci podręcznej: pamięć podręczna jest domyślnie wyłączona, jeśli masz przepływ pracy, który używa punktów końcowych zdefiniowanych w konfiguracji. Zaleca się również wyłączenie pamięci podręcznej w tym przypadku, ponieważ włączenie tej pamięci podręcznej może być niezabezpieczone. Jeśli na przykład dla każdego wysyłania jest wymagana inna tożsamość (różne poświadczenia lub personifikacja).

Zmiana poziomu udostępniania pamięci podręcznej dla przepływu pracy klienta

Aby ustawić udostępnianie pamięci podręcznej w przepływie pracy klienta, dodaj wystąpienie SendMessageChannelCache klasy jako rozszerzenie do żądanego zestawu wystąpień przepływu pracy. Spowoduje to udostępnienie pamięci podręcznej we wszystkich wystąpieniach przepływu pracy. W poniższych przykładach kodu pokazano, jak wykonać te kroki.

Najpierw zadeklaruj wystąpienie typu SendMessageChannelCache.

// Create an instance of SendMessageChannelCache with default cache settings.  
static SendMessageChannelCache sharedChannelCacheExtension =  
    new SendMessageChannelCache();  

Następnie dodaj rozszerzenie pamięci podręcznej do każdego wystąpienia przepływu pracy klienta.

WorkflowApplication clientInstance1 = new WorkflowApplication(new clientWorkflow1());  
WorkflowApplication clientInstance2 = new WorkflowApplication(new clientWorkflow2());  
  
// Share the cache extension object
  
clientInstance1.Extensions.Add(sharedChannelCacheExtension);  
clientInstance2.Extensions.Add(sharedChannelCacheExtension);  

Zmiana poziomu udostępniania pamięci podręcznej dla hostowanej usługi przepływu pracy

Aby ustawić udostępnianie pamięci podręcznej w hostowanej usłudze przepływu pracy, dodaj wystąpienie SendMessageChannelCache klasy jako rozszerzenie do wszystkich hostów usługi przepływu pracy. Spowoduje to udostępnienie pamięci podręcznej na wszystkich hostach usługi przepływu pracy. W poniższych przykładach kodu pokazano, jak wykonać te kroki.

Najpierw zadeklaruj wystąpienie typu SendMessageChannelCache na poziomie klasy.

// Create static instance of SendMessageChannelCache with default cache settings.  
static SendMessageChannelCache sharedChannelCacheExtension = new  
    SendMessageChannelCache();  

Następnie dodaj rozszerzenie statycznej pamięci podręcznej do każdego hosta usługi przepływu pracy.

WorkflowServiceHost host1 = new WorkflowServiceHost(new serviceWorkflow1(), new Uri(baseAddress1));  
WorkflowServiceHost host2 = new WorkflowServiceHost(new serviceWorkflow2(), new Uri(baseAddress2));  
  
// Share the static cache to get an AppDomain level cache.  
host1.WorkflowExtensions.Add(sharedChannelCacheExtension);  
host2.WorkflowExtensions.Add(sharedChannelCacheExtension);  

Aby ustawić udostępnianie pamięci podręcznej w usłudze hostowanego przepływu pracy na poziom wystąpienia, dodaj Func<SendMessageChannelCache> delegata jako rozszerzenie do hosta usługi przepływu pracy i przypisz ten delegat do kodu, który tworzy wystąpienie nowego wystąpienia SendMessageChannelCache klasy. Spowoduje to utworzenie innej pamięci podręcznej dla każdego pojedynczego wystąpienia przepływu pracy zamiast pojedynczej pamięci podręcznej udostępnionej przez wszystkie wystąpienia przepływu pracy na hoście usługi przepływu pracy. Poniższy przykład kodu pokazuje, jak to osiągnąć przy użyciu wyrażenia lambda w celu bezpośredniego zdefiniowania SendMessageChannelCache rozszerzenia, do którego wskazuje delegat.

serviceHost.WorkflowExtensions.Add(() => new SendMessageChannelCache  
{  
    // Use FactorySettings property to add custom factory cache settings.  
    FactorySettings = new ChannelCacheSettings
    { MaxItemsInCache = 5, },  
    // Use ChannelSettings property to add custom channel cache settings.  
    ChannelSettings = new ChannelCacheSettings
    { MaxItemsInCache = 10 },  
});  

Dostosowywanie Ustawienia pamięci podręcznej

Możesz dostosować ustawienia pamięci podręcznej dla pamięci podręcznej fabryki kanału i pamięci podręcznej kanału. Ustawienia pamięci podręcznej ChannelCacheSettings są zdefiniowane w klasie . Klasa SendMessageChannelCache definiuje domyślne ustawienia pamięci podręcznej dla pamięci podręcznej fabryki kanału i pamięci podręcznej kanału w konstruktorze bez parametrów. W poniższej tabeli wymieniono wartości domyślne tych ustawień pamięci podręcznej dla każdego typu pamięci podręcznej.

Ustawienia Limit czasu dzierżawy (min) IdleTimeout (min. MaxItemsInCache
Domyślna pamięć podręczna fabryki TimeSpan.MaxValue 2 16
Domyślna pamięć podręczna kanału 5 2 16

Aby dostosować ustawienia pamięci podręcznej fabryki i pamięci podręcznej kanału, utwórz wystąpienie SendMessageChannelCache klasy przy użyciu konstruktora SendMessageChannelCache sparametryzowanego i przekaż nowe wystąpienie ChannelCacheSettings elementu z wartościami niestandardowymi do każdego z factorySettings parametrów i channelSettings . Następnie dodaj nowe wystąpienie tej klasy jako rozszerzenie do hosta usługi przepływu pracy lub wystąpienia przepływu pracy. Poniższy przykład kodu pokazuje, jak wykonać te kroki dla wystąpienia przepływu pracy.

ChannelCacheSettings factorySettings = new ChannelCacheSettings{  
                        MaxItemsInCache = 5,
                        IdleTimeout = TimeSpan.FromMinutes(5),
                        LeaseTimeout = TimeSpan.FromMinutes(20)};  
  
ChannelCacheSettings channelSettings = new ChannelCacheSettings{  
                        MaxItemsInCache = 5,
                        IdleTimeout = TimeSpan.FromMinutes(2),  
                        LeaseTimeout = TimeSpan.FromMinutes(10) };  
  
SendMessageChannelCache customChannelCacheExtension =
    new SendMessageChannelCache(factorySettings, channelSettings);  
  
clientInstance.Extensions.Add(customChannelCacheExtension);  

Aby włączyć buforowanie, gdy usługa przepływu pracy ma punkty końcowe zdefiniowane w konfiguracji, utwórz wystąpienie SendMessageChannelCache klasy przy użyciu sparametryzowanego konstruktora SendMessageChannelCache z parametrem ustawionym allowUnsafeCaching na true. Następnie dodaj nowe wystąpienie tej klasy jako rozszerzenie do hosta usługi przepływu pracy lub wystąpienia przepływu pracy. Poniższy przykład kodu pokazuje, jak włączyć buforowanie dla wystąpienia przepływu pracy.

SendMessageChannelCache customChannelCacheExtension =
    new SendMessageChannelCache{ AllowUnsafeCaching = true };  
  
clientInstance.Extensions.Add(customChannelCacheExtension);  

Aby całkowicie wyłączyć pamięć podręczną fabryk kanałów i kanałów, wyłącz pamięć podręczną fabryki kanałów. Spowoduje to również wyłączenie pamięci podręcznej kanału, ponieważ kanały są własnością odpowiednich fabryk kanałów. Aby wyłączyć pamięć podręczną fabryki kanałów, przekaż factorySettings parametr do SendMessageChannelCache konstruktora zainicjowanego do ChannelCacheSettings wystąpienia o MaxItemsInCache wartości 0. Poniższy przykład kodu pokazuje to.

// Disable the factory cache. This results in the channel cache to be turned off as well.  
ChannelCacheSettings factorySettings = new ChannelCacheSettings  
    { MaxItemsInCache = 0 };  
  
ChannelCacheSettings channelSettings = new ChannelCacheSettings();  
  
SendMessageChannelCache customChannelCacheExtension =
    new SendMessageChannelCache(factorySettings, channelSettings);
  
clientInstance.Extensions.Add(customChannelCacheExtension);  

Możesz użyć tylko pamięci podręcznej fabryki kanałów i wyłączyć pamięć podręczną kanału, przekazując channelSettings parametr do SendMessageChannelCache konstruktora zainicjowanego do ChannelCacheSettings wystąpienia o MaxItemsInCache wartości 0. Poniższy przykład kodu pokazuje to.

ChannelCacheSettings factorySettings = new ChannelCacheSettings();  
// Disable only the channel cache.  
ChannelCacheSettings channelSettings = new ChannelCacheSettings  
    { MaxItemsInCache = 0};  
  
SendMessageChannelCache customChannelCacheExtension =
    new SendMessageChannelCache(factorySettings, channelSettings);
  
clientInstance.Extensions.Add(customChannelCacheExtension);  

W hostowanej usłudze przepływu pracy można określić ustawienia pamięci podręcznej fabryki i pamięci podręcznej kanału w pliku konfiguracji aplikacji. W tym celu należy dodać zachowanie usługi, które zawiera ustawienia pamięci podręcznej pamięci podręcznej fabryki i kanał i dodać to zachowanie usługi z usługą. Poniższy przykład przedstawia zawartość pliku konfiguracji zawierającego MyChannelCacheBehavior zachowanie usługi z ustawieniami niestandardowej pamięci podręcznej fabryki i pamięci podręcznej kanału. To zachowanie usługi jest dodawane do usługi za pośrednictwem atrybutu behaviorConfiguration .

<configuration>
  <system.serviceModel>  
    <!-- List of other config sections here -->
    <behaviors>  
      <serviceBehaviors>  
        <behavior name="MyChannelCacheBehavior">  
          <sendMessageChannelCache allowUnsafeCaching ="false" >  
            <!-- Control only the host level settings -->
            <factorySettings maxItemsInCache = "8" idleTimeout = "00:05:00" leaseTimeout="10:00:00" />  
            <channelSettings maxItemsInCache = "32" idleTimeout = "00:05:00" leaseTimeout="00:06:00" />  
          </sendMessageChannelCache>  
        </behavior>  
      </serviceBehaviors>  
    </behaviors>  
    <services>  
      <service name="MyService" behaviorConfiguration="MyChannelCacheBehavior" />  
    </services>  
  </system.serviceModel>  
</configuration>