Delen via


Procedure: Partitionering van servicegegevens

In dit onderwerp worden de basisstappen beschreven die nodig zijn voor het partitioneren van berichten over meerdere exemplaren van dezelfde doelservice. Servicegegevenspartitionering wordt meestal gebruikt wanneer u een service moet schalen om een betere kwaliteit van de service te bieden, of wanneer u aanvragen van verschillende klanten op een specifieke manier moet afhandelen. Berichten van klanten met een hoge waarde of 'Gold' moeten bijvoorbeeld met een hogere prioriteit worden verwerkt dan berichten van een standaardklant.

In dit voorbeeld worden berichten doorgestuurd naar een van de twee exemplaren van de regularCalc-service. Beide exemplaren van de service zijn identiek; de service die wordt vertegenwoordigd door het eindpunt van de calculator1 verwerkt echter berichten die zijn ontvangen van klanten met hoge waarde, het rekenmachine 2-eindpunt verwerkt berichten van andere klanten

Het bericht dat vanaf de client wordt verzonden, bevat geen unieke gegevens die kunnen worden gebruikt om te bepalen naar welk service-exemplaar het bericht moet worden gerouteerd. Om elke client toe te staan om gegevens naar een specifieke doelservice te routeren, implementeren we twee service-eindpunten die worden gebruikt voor het ontvangen van berichten.

Notitie

Hoewel in dit voorbeeld specifieke eindpunten worden gebruikt om gegevens te partitioneren, kan dit ook worden bereikt met behulp van informatie in het bericht zelf, zoals header- of hoofdtekstgegevens.

Servicegegevenspartitionering implementeren

  1. Maak de basisconfiguratie van de routeringsservice door de service-eindpunten op te geven die door de service worden weergegeven. In het volgende voorbeeld worden twee eindpunten gedefinieerd, die worden gebruikt voor het ontvangen van berichten. Het definieert ook de clienteindpunten, die worden gebruikt voor het verzenden van berichten naar de reguliereCalc-service-exemplaren.

    <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. Definieer de filters die worden gebruikt om berichten naar de doeleindpunten te routeren. In dit voorbeeld wordt het EndpointName-filter gebruikt om te bepalen welk service-eindpunt het bericht heeft ontvangen. In het volgende voorbeeld worden de benodigde routeringssectie en filters gedefinieerd.

    <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. Definieer de filtertabel, die elk filter koppelt aan een clienteindpunt. In dit voorbeeld wordt het bericht gerouteerd op basis van het specifieke eindpunt dat het is ontvangen. Omdat het bericht slechts kan overeenkomen met een van de twee mogelijke filters, is het niet nodig om filterprioriteit te gebruiken om te bepalen in de volgorde waarin filters worden geƫvalueerd.

    Hieronder wordt de filtertabel gedefinieerd en worden de eerder gedefinieerde filters toegevoegd.

    <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. Als u binnenkomende berichten wilt evalueren op basis van de filters in de tabel, moet u de filtertabel koppelen aan de service-eindpunten met behulp van het routeringsgedrag. In het volgende voorbeeld ziet u hoe u filterTable1 aan de service-eindpunten kunt koppelen:

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

Opmerking

Hier volgt een volledige lijst van het configuratiebestand.

<?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>  

Zie ook