Dela via


Anvisningar: Partitionering av tjänstdata

Det här avsnittet beskriver de grundläggande steg som krävs för att partitionering av meddelanden över flera instanser av samma måltjänst. Partitionering av tjänstdata används vanligtvis när du behöver skala en tjänst för att tillhandahålla bättre tjänstkvalitet eller när du behöver hantera begäranden från olika kunder på ett visst sätt. Till exempel kan meddelanden från kunder med högt värde eller "Guld" behöva bearbetas med högre prioritet än meddelanden från en standardkund.

I det här exemplet dirigeras meddelanden till en av två instanser av regularCalc-tjänsten. Båda instanserna av tjänsten är identiska. Men tjänsten som representeras av kalkylatorn1-slutpunkten bearbetar meddelanden som tas emot från kunder med högt värde, kalkylatorn 2-slutpunkten bearbetar meddelanden från andra kunder

Meddelandet som skickas från klienten har inga unika data som kan användas för att identifiera vilken tjänstinstans meddelandet ska dirigeras till. För att varje klient ska kunna dirigera data till en specifik måltjänst implementerar vi två tjänstslutpunkter som ska användas för att ta emot meddelanden.

Kommentar

Även om det här exemplet använder specifika slutpunkter för att partitioneras data, kan detta också åstadkommas med hjälp av information som finns i själva meddelandet, till exempel sidhuvud- eller brödtextdata.

Implementera tjänstdatapartitionering

  1. Skapa den grundläggande routningstjänstens konfiguration genom att ange tjänstslutpunkterna som exponeras av tjänsten. I följande exempel definieras två slutpunkter som ska användas för att ta emot meddelanden. Den definierar även klientslutpunkterna, som används för att skicka meddelanden till de vanligaCalc-tjänstinstanserna.

    <services>  
      <service behaviorConfiguration="routingConfiguration"  
               name="System.ServiceModel.Routing.RoutingService">  
        <host>  
          <baseAddresses>  
            <add baseAddress="http://localhost/routingservice/router" />  
          </baseAddresses>  
        </host>  
        <!--Set up the inbound endpoints for the Routing Service-->  
        <!--create the endpoints for the calculator service-->  
        <endpoint address="calculator1"  
                  binding="wsHttpBinding"  
                  name="calculator1Endpoint"  
                  contract="System.ServiceModel.Routing.IRequestReplyRouter" />  
        <endpoint address="calculator2"  
                  binding="wsHttpBinding"  
                  name="calculator2Endpoint"  
                  contract="System.ServiceModel.Routing.IRequestReplyRouter" />  
       </service>  
    </services>  
    <client>  
    <!--set up the destination endpoints-->  
        <endpoint name="CalcEndpoint1"  
                  address="net.tcp://localhost:9090/servicemodelsamples/service/"  
                  binding="netTcpBinding"  
                  contract="*" />  
    
        <endpoint name="CalcEndpoint2"  
                  address="net.tcp://localhost:8080/servicemodelsamples/service/"  
                  binding="netTcpBinding"  
                  contract="*" />  
     </client>  
    
  2. Definiera de filter som används för att dirigera meddelanden till målslutpunkterna. I det här exemplet används filtret EndpointName för att avgöra vilken tjänstslutpunkt som tog emot meddelandet. I följande exempel definieras det nödvändiga routningsavsnittet och filtren.

    <filters>  
      <!--define the different message filters-->  
      <!--define endpoint name filters looking for messages that show up on the virtual endpoints-->  
      <filter name="HighPriority" filterType="EndpointName"  
              filterData="calculator1Endpoint"/>  
      <filter name="NormalPriority" filterType="EndpointName"  
              filterData="calculator2Endpoint"/>  
    </filters>  
    
  3. Definiera filtertabellen, som associerar varje filter med en klientslutpunkt. I det här exemplet dirigeras meddelandet baserat på den specifika slutpunkt som det togs emot över. Eftersom meddelandet bara kan matcha ett av de två möjliga filtren behöver du inte använda filterprioritet för att styra i vilken ordning filter utvärderas.

    Följande definierar filtertabellen och lägger till filtren som definierades tidigare.

    <filterTables>  
       <filterTable name="filterTable1">  
         <!--add the filters to the message filter table-->  
         <add filterName="HighPriority" endpointName="CalcEndpoint1"/>  
         <add filterName="NormalPriority" endpointName="CalcEndpoint2"/>  
       </filterTable>  
    </filterTables>  
    
  4. Om du vill utvärdera inkommande meddelanden mot filtren i tabellen måste du associera filtertabellen med tjänstslutpunkterna med hjälp av routningsbeteendet. I följande exempel visas hur du associerar "filterTable1" med tjänstslutpunkterna:

    <behaviors>  
      <!--default routing service behavior definition-->  
      <serviceBehaviors>  
        <behavior name="routingConfiguration">  
          <routing filterTableName="filterTable1" />  
        </behavior>  
      </serviceBehaviors>  
    </behaviors>  
    

Exempel

Följande är en fullständig lista över konfigurationsfilen.

<?xml version="1.0" encoding="utf-8" ?>  
<!-- Copyright (c) Microsoft Corporation. All rights reserved -->  
<configuration>  
  <system.serviceModel>  
    <services>  
      <service behaviorConfiguration="routingConfiguration"  
               name="System.ServiceModel.Routing.RoutingService">  
        <host>  
          <baseAddresses>  
            <add baseAddress="http://localhost/routingservice/router" />  
          </baseAddresses>  
        </host>  
        <!--Set up the inbound endpoints for the Routing Service-->  
        <!--create the endpoints for the calculator service-->  
        <endpoint address="calculator1"  
                  binding="wsHttpBinding"  
                  name="calculator1Endpoint"  
                  contract="System.ServiceModel.Routing.IRequestReplyRouter" />  
        <endpoint address="calculator2"  
                  binding="wsHttpBinding"  
                  name="calculator2Endpoint"  
                  contract="System.ServiceModel.Routing.IRequestReplyRouter" />  
  
      </service>  
    </services>  
    <behaviors>  
      <!--default routing service behavior definition-->  
      <serviceBehaviors>  
        <behavior name="routingConfiguration">  
          <routing filterTableName="filterTable1" />  
        </behavior>  
      </serviceBehaviors>  
    </behaviors>  
  
    <client>  
<!--set up the destination endpoints-->  
      <endpoint name="CalcEndpoint1"  
                address="net.tcp://localhost:9090/servicemodelsamples/service/"  
                binding="netTcpBinding"  
                contract="*" />  
  
      <endpoint name="CalcEndpoint2"  
                address="net.tcp://localhost:8080/servicemodelsamples/service/"  
                binding="netTcpBinding"  
                contract="*" />  
    </client>  
    <routing>  
      <!-- use the namespace table element to define a prefix for our custom namespace-->  
  
      <filters>  
        <!--define the different message filters-->  
        <!--define endpoint name filters looking for messages that show up on the virtual endpoints-->  
        <filter name="HighPriority" filterType="EndpointName"  
                filterData="calculator1Endpoint"/>  
        <filter name="NormalPriority" filterType="EndpointName"  
                filterData="calculator2Endpoint"/>  
      </filters>  
  
      <filterTables>  
        <filterTable name="filterTable1">  
          <!--add the filters to the message filter table-->  
          <add filterName="HighPriority" endpointName="CalcEndpoint1"/>  
          <add filterName="NormalPriority" endpointName="CalcEndpoint2"/>  
        </filterTable>  
      </filterTables>  
  
    </routing>  
  </system.serviceModel>  
</configuration>  

Se även