Como: fornecer particionamento de dados
Este tópico descreve as etapas básicas necessárias para particionar mensagens em várias instâncias do mesmo serviço de destino. O particionamento de dados de serviço normalmente é usado quando você precisa escalar um serviço para fornecer uma melhor qualidade de serviço ou quando você precisa lidar com solicitações de clientes diferentes de uma forma específica. Por exemplo, as mensagens de clientes de alto valor ou "Gold" podem precisar ser processadas com uma prioridade maior do que as mensagens de um cliente padrão.
Neste exemplo, as mensagens são encaminhadas para uma das duas instâncias do serviço regularCalc. As duas instâncias do serviço são idênticas. No entanto, o serviço representado pela calculadora1 processa as mensagens recebidas de clientes de alto valor e a calculadora 2 processa as mensagens de outros clientes
A mensagem enviada do cliente não tem dados exclusivos que possam ser usados para identificar para qual instância de serviço a mensagem deve ser encaminhada. Para permitir que cada cliente encaminhe os dados para um serviço de destino específico, implementaremos dois pontos de extremidade de serviço que serão usados para receber as mensagens.
Observação
Embora este exemplo use pontos de extremidade específicos para particionar dados, isso também pode ser feito usando informações contidas na própria mensagem, como os dados do cabeçalho ou do corpo.
Implementar o particionamento de dados de serviço
Crie a configuração básica do Serviço de Roteamento especificando os pontos de extremidade de serviço expostos pelo serviço. O exemplo a seguir define dois pontos de extremidade, que serão usados para receber mensagens. Ele também define os pontos de extremidade do cliente, que são usados para enviar mensagens para as instâncias do serviço regularCalc.
<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>
Defina os filtros usados para encaminhar as mensagens para os pontos de extremidade de destino. Para este exemplo, o filtro EndpointName é usado para determinar qual ponto de extremidade de serviço recebeu a mensagem. O exemplo a seguir define a seção de roteamento e os filtros necessários.
<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>
Defina a tabela de filtro, que associa cada filtro a um ponto de extremidade do cliente. Neste exemplo, a mensagem será encaminhada com base no ponto de extremidade específico pelo qual foi recebida. Como a mensagem só pode corresponder a um dos dois filtros possíveis, não há necessidade de usar a prioridade de filtro para controlar a ordem na qual os filtros são avaliados.
O seguinte define a tabela de filtro e adiciona os filtros definidos anteriormente.
<filterTables> <filterTable name="filterTable1"> <!--add the filters to the message filter table--> <add filterName="HighPriority" endpointName="CalcEndpoint1"/> <add filterName="NormalPriority" endpointName="CalcEndpoint2"/> </filterTable> </filterTables>
Para avaliar as mensagens de entrada em relação aos filtros contidos na tabela, você precisa associar a tabela de filtro aos pontos de extremidade de serviço usando o comportamento de roteamento. O seguinte exemplo demonstra a associação de "filterTable1" aos pontos de extremidade de serviço:
<behaviors> <!--default routing service behavior definition--> <serviceBehaviors> <behavior name="routingConfiguration"> <routing filterTableName="filterTable1" /> </behavior> </serviceBehaviors> </behaviors>
Exemplo
Veja a seguir a listagem completa do arquivo de configuração.
<?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>