Compartir a través de


Procedimientos recomendados para lograr sesiones confiables

En esta sección se describen los procedimientos recomendados para tener sesiones confiables.

Establecimiento de MaxTransferWindowSize

Las sesiones confiables en Windows Communication Foundation (WCF) usan una ventana de transferencia para mantener los mensajes en el cliente y el servicio. La propiedad configurable MaxTransferWindowSize indica cuántos mensajes puede contener la ventana de transferencia.

En el remitente, indica cuántos mensajes puede contener la ventana de transferencia mientras espera las confirmaciones; en el receptor, indica cuántos mensajes almacenar en búfer para el servicio.

La elección del tamaño adecuado afecta a la eficiencia de la red y a la capacidad óptima del servicio. En las siguientes secciones se describe qué es necesario tener en cuenta al elegir un valor para esta propiedad y el impacto de ese valor.

El tamaño predeterminado de la ventana de transferencia es ocho mensajes.

Uso eficaz de la red

En este contexto, el término red corresponde a todo lo que se usa como base de comunicación entre un cliente (remitente) y un servicio (receptor). Esto incluye las conexiones de transporte y cualquier intermediario o puentes que haya en medio, incluidos los enrutadores SOAP o los proxys o firewalls HTTP.

El uso eficaz de la red garantiza el uso total de la capacidad de la red. La cantidad de datos que se pueden transferir por segundo a través de la red (velocidad de datos) y el tiempo que se tarda en transferir los datos desde el remitente hasta el receptor (latencia) afectan a la eficacia de uso de la red.

En el remitente, la propiedad MaxTransferWindowSize indica cuántos mensajes puede contener su ventana de transferencia mientras espera las confirmaciones. Si la latencia de red es alta, para garantizar un remitente que responda y una utilización eficaz de la red, debería aumentar el tamaño de la ventana de transferencia.

Por ejemplo, aun cuando el remitente mantenga la velocidad de datos, la latencia podría ser alta si existen varios intermediarios entre el remitente y el receptor o un intermediario o red con pérdidas. Por consiguiente, el remitente tiene que esperar las confirmaciones de los mensajes en su ventana de transferencia antes de aceptar nuevos mensajes que enviar a través de la conexión. Mientras más pequeño sea el búfer con una alta latencia, menos eficaz será el uso de la red. Por otro lado, un tamaño demasiado grande de la ventana de transferencia puede afectar al servicio, porque puede que este tenga que alcanzar la alta velocidad de los datos enviados por el cliente.

Ejecución del servicio a máxima capacidad

Por mucho que la red se use de forma eficiente, lo ideal es que el servicio también funcione a una capacidad óptima. La propiedad de tamaño de la ventana de transferencia en el receptor indica cuántos mensajes puede almacenar en búfer el receptor. Este almacenamiento en búfer de mensajes no solo ayuda al control del flujo de la red, sino también permite al servicio ejecutarse a capacidad completa. Por ejemplo, si el búfer tiene un mensaje y los mensajes llegan antes de que el servicio pueda procesarlos, la red podría descartar mensajes y se podría desperdiciar o infrautilizar la capacidad.

El uso de un búfer aumenta la disponibilidad del servicio, puesto que recibe y almacena en búfer el mensaje de manera simultánea, al mismo tiempo que procesa los mensajes recibidos anteriormente.

Se recomienda que utilice el mismo valor MaxTransferWindowSize en el remitente y el receptor.

Habilitación del control de flujo

El control de flujo es un mecanismo que garantiza que el remitente y el receptor se mantienen al mismo ritmo, es decir, que los mensajes se consumen y se actúa sobre ellos según se generan. El tamaño de la ventana de transferencia en el cliente y el servicio asegura que el remitente y receptor se encuentran dentro de una ventana razonable de sincronización.

Se recomienda encarecidamente establecer la propiedad FlowControlEnabled en true al usar una sesión confiable entre un cliente WCF y un servicio WCF.

Establecimiento de MaxPendingChannels

Al escribir un servicio que permite la comunicación de sesión confiable desde clientes diferentes, es posible hacer que muchos clientes establezcan una sesión confiable en el servicio al mismo tiempo. La respuesta del servicio en estas situaciones depende de la propiedad MaxPendingChannels.

Cuando el remitente crea un canal de sesión confiable en un receptor, un protocolo de enlace entre ellos establece una sesión confiable. Una vez establecida la sesión confiable, el canal se coloca en una cola de canales pendientes para que el servicio los acepte. La propiedad MaxPendingChannels indica cuántos canales pueden estar en este estado.

Es posible que el servicio esté en un estado donde no pueda aceptar más canales. Si la cola está llena, se rechaza un intento de establecer una sesión confiable y el cliente tiene que reintentarlo.

También es posible que los canales pendientes de la cola permanezcan en la cola durante más tiempo. Entretanto, puede aparecer un tiempo de espera de inactividad en la sesión confiable, lo que hace que el canal pase a un estado de error.

Al escribir un servicio que se ocupa simultáneamente de varios clientes, debería establecer un valor que sea conveniente para sus necesidades. Establecer un valor demasiado alto para la propiedad MaxPendingChannels afecta a su espacio de trabajo.

El valor predeterminado de MaxPendingChannels es cuatro canales.

Hospedaje y sesiones confiables

Cuando se hospeda un servicio en web que usa sesiones confiables, debe tener en cuenta las siguientes consideraciones importantes:

  • Las sesiones confiables tienen estado y el estado se mantiene en el AppDomain. Esto significa que todos los mensajes que forman parte de una sesión confiable se deben procesar en el mismo AppDomain. Las granjas y jardines de servidores web donde el tamaño de la granja o el jardín sea mayor que uno no pueden garantizar esta restricción.

  • Las sesiones confiables que usan canales HTTP duales (por ejemplo, mediante WsDualHttpBinding) pueden requerir más de las dos conexiones HTTP predeterminadas por cliente. Esto significa que una sesión confiable dúplex puede necesitar hasta dos conexiones en cada sentido, porque, en cualquier momento dado, se pueden estar transfiriendo mensajes de protocolo y aplicación simultáneos en cada sentido. Bajo determinadas condiciones, dependiendo del patrón de intercambio de mensajes del servicio, esto significa que es posible interbloquear un servicio hospedado en web usando sesiones confiables y HTTP duales. Para aumentar el número de conexiones HTTP permitidas por cliente, agregue lo siguiente al archivo de configuración pertinente (por ejemplo, web.config del servicio en cuestión):

    <configuration>
      <system.net>
        <connectionManagement>
          <add name="*" maxconnection="4" />
        </connectionManagement>
      </system.net>
    </configuration>
    

    El valor del atributo maxconnection es el número de conexiones necesarias. El mínimo en este caso debe ser cuatro conexiones.