Nota
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
Orleans garantiza que cuando se realiza una llamada de grano, una instancia de ese grano está disponible en memoria en algún servidor del clúster para atender la solicitud. Si el grano no está activo actualmente en el clúster, Orleans elige un servidor para activar el grano. Este proceso se denomina ubicación de grano. La colocación también es una manera Orleans de equilibrar la carga: colocar granos ocupados uniformemente ayuda a distribuir la carga de trabajo en el clúster.
El proceso de colocación en Orleans es totalmente configurable. Elija entre políticas de ubicación predefinidas, como aleatoria, preferencia local y en función de la carga, o configure lógica personalizada. Esto permite una flexibilidad total para decidir dónde se crean los granos. Por ejemplo, coloque granos en un servidor cerca de los recursos con los que necesitan operar o cerca de otros granos con los que se comunican. De forma predeterminada, Orleans elige un servidor compatible aleatoriamente.
Configurar la estrategia de colocación que Orleans utiliza globalmente o por clase de grano.
Colocación aleatoria
Orleans selecciona aleatoriamente un servidor de los servidores compatibles del clúster. Para configurar esta estrategia de colocación, agregue el RandomPlacementAttribute a la clase de grano.
Ubicación local
Si el servidor local es compatible, Orleans selecciona el servidor local; de lo contrario, selecciona un servidor aleatorio. Configure esta estrategia de selección de ubicación agregando el PreferLocalPlacementAttribute a la clase de grano.
Colocación en función del hash
Orleans convierte el identificador de grano en un hash, obteniendo un entero no negativo, y aplica una operación de módulo con el número de servidores compatibles. A continuación, selecciona el servidor correspondiente en la lista de servidores compatibles ordenados por dirección del servidor. Tenga en cuenta que no se garantiza que esta ubicación permanezca estable a medida que cambia la pertenencia al clúster. En concreto, agregar, quitar o reiniciar servidores puede alterar el servidor seleccionado para un determinado Grain ID. Dado que los granos colocados mediante esta estrategia se registran en el directorio de granos, normalmente no tiene un efecto notable este cambio en la decisión de ubicación a medida que cambia la pertenencia.
Configure esta estrategia de selección de ubicación agregando el HashBasedPlacementAttribute a la clase de grano.
Colocación en función del recuento de activación
Esta estrategia de colocación intenta colocar nuevas activaciones de grano en el servidor menos cargado en función del número de granos ocupados recientemente. Incluye un mecanismo en el que todos los servidores publican periódicamente su recuento total de activación en todos los demás servidores. Después, el director de selección de ubicación selecciona un servidor previsto para tener las menos activaciones examinando el recuento de activación notificado más recientemente y predice el recuento actual en función de las activaciones recientes realizadas por el director de selección de ubicación en el servidor actual. El director selecciona varios servidores aleatoriamente al realizar esta predicción para evitar que varios servidores independientes sobrecarguen el mismo servidor. De forma predeterminada, se seleccionan dos servidores aleatoriamente, pero este valor se puede configurar a través de ActivationCountBasedPlacementOptions.
Este algoritmo se basa en la tesis The Power of Two Choices in Randomized Load Balancing de Michael David Mitzenmacher. También se usa en Nginx para el equilibrio de carga distribuido, como se describe en el artículo NGINX y el "Power of Two Choices" Load-Balancing Algorithm.
Configure esta estrategia de selección de ubicación agregando el ActivationCountBasedPlacementAttribute a la clase de grano.
Asignación de trabajadores sin estado
La colocación de trabajos sin estado es una estrategia especial de colocación que utilizan los granos de trabajo sin estado. Esta ubicación funciona casi de forma idéntica a PreferLocalPlacement
, excepto que cada servidor puede tener varias activaciones del mismo grano y el grano no está registrado en el directorio de granos, ya que no es necesario.
Configure esta estrategia de selección de ubicación agregando el StatelessWorkerAttribute a la clase de grano.
Asignación en silo basada en roles
Se trata de una estrategia de colocación determinista que coloca granos en silos con un rol específico. Configure esta estrategia de selección de ubicación agregando el SiloRoleBasedPlacementAttribute a la clase de grano.
Colocación optimizada de recursos
La estrategia de selección de ubicación optimizada para recursos intenta optimizar los recursos del clúster al equilibrar las activaciones específicas entre silos en función de la memoria disponible y el uso de CPU. Asigna ponderaciones a las estadísticas en tiempo de ejecución para priorizar los distintos recursos y calcula una puntuación normalizada para cada silo. Se elige el silo con la puntuación más baja para colocar la próxima activación. La normalización garantiza que cada propiedad contribuye proporcionalmente a la puntuación general. Ajuste los pesos a través de ResourceOptimizedPlacementOptions en función de requisitos y prioridades específicos para diferentes recursos.
Además, esta estrategia de colocación ofrece una opción de crear una preferencia más fuerte por el silo local (el que recibe la solicitud para realizar una nueva selección de ubicación) para ser elegido como destino de la activación. Controle esto a través de la LocalSiloPreferenceMargin
propiedad , parte de las opciones.
Además, un algoritmo en línea y adaptable proporciona un efecto de suavizado que evita caídas rápidas de señal al transformar la señal en un proceso de decaimiento similar a un polinomio. Esto es especialmente importante para el uso de CPU y contribuye en general a evitar la saturación de los recursos en los silos, especialmente los recién unidos.
Este algoritmo se basa en la selección de ubicación basada en recursos con filtrado de Kalman en modo dual cooperativo.
Configure esta estrategia de selección de ubicación agregando el ResourceOptimizedPlacementAttribute a la clase de grano.
Elegir una estrategia de colocación
La elección de la estrategia de colocación de grano adecuada, más allá de los valores predeterminados Orleans , requiere supervisión y evaluación. La elección debe basarse en el tamaño y la complejidad de la aplicación, las características de la carga de trabajo y el entorno de implementación.
La colocación aleatoria se basa en la ley de números grandes, por lo que suele ser un buen valor predeterminado para cargas impredecibles distribuidas en muchos granos (10 000 o más).
La colocación basada en recuento de activación también tiene un elemento aleatorio, que se basa en el principio Power of Two Choices. Se trata de un algoritmo usado habitualmente para el equilibrio de carga distribuido y se usa en equilibradores de carga populares. Los silos publican con frecuencia estadísticas de tiempo de ejecución a otros silos del clúster, entre los que se incluyen:
- Memoria disponible, memoria física total y uso de memoria.
- Uso de CPU.
- Recuento total de activación y recuento de activación activa reciente.
- Una ventana deslizante de activaciones activas en los últimos segundos, a veces denominada conjunto de activaciones en funcionamiento.
A partir de estas estadísticas, actualmente solo se usan recuentos de activación para determinar la carga en un silo determinado.
En última instancia, experimente con diferentes estrategias y supervise las métricas de rendimiento para determinar la mejor opción. Seleccionar la estrategia adecuada de colocación de granos optimiza el rendimiento, la escalabilidad y la rentabilidad de las aplicaciones Orleans.
Configurar la estrategia de ubicación predeterminada
Orleans utiliza la colocación aleatoria a menos que se anule el valor predeterminado. Invalide la estrategia de selección de ubicación predeterminada mediante el registro de una implementación de PlacementStrategy durante la configuración:
siloBuilder.ConfigureServices(services =>
services.AddSingleton<PlacementStrategy, MyPlacementStrategy>());
Configuración de la estrategia de colocación de un grano
Configure la estrategia de selección de ubicación para un tipo de grano agregando el atributo adecuado a la clase de grano. Los atributos pertinentes se especifican en las secciones de estrategias de selección de ubicación anteriores.
Ejemplo de estrategia de colocación personalizada
En primer lugar, defina una clase que implemente la IPlacementDirector interfaz, lo que requiere un único método. En este ejemplo, supongamos que se define una función GetSiloNumber
que devuelve un número de silo en función del Guid del grano que se va a crear.
public class SamplePlacementStrategyFixedSiloDirector : IPlacementDirector
{
public Task<SiloAddress> OnAddActivation(
PlacementStrategy strategy,
PlacementTarget target,
IPlacementContext context)
{
var silos = context.GetCompatibleSilos(target).OrderBy(s => s).ToArray();
int silo = GetSiloNumber(target.GrainIdentity.PrimaryKey, silos.Length);
return Task.FromResult(silos[silo]);
}
}
A continuación, defina dos clases para permitir la asignación de clases de grano a la estrategia:
[Serializable]
public sealed class SamplePlacementStrategy : PlacementStrategy
{
}
[AttributeUsage(AttributeTargets.Class, AllowMultiple = false)]
public sealed class SamplePlacementStrategyAttribute : PlacementAttribute
{
public SamplePlacementStrategyAttribute() :
base(new SamplePlacementStrategy())
{
}
}
A continuación, etiquete las clases de grano destinadas a usar esta estrategia con el atributo :
[SamplePlacementStrategy]
public class MyGrain : Grain, IMyGrain
{
// ...
}
Por último, registre la estrategia al compilar :ISiloHost
private static async Task<ISiloHost> StartSilo()
{
var builder = new HostBuilder(c =>
{
// normal configuration methods omitted for brevity
c.ConfigureServices(ConfigureServices);
});
var host = builder.Build();
await host.StartAsync();
return host;
}
private static void ConfigureServices(IServiceCollection services)
{
services.AddPlacementDirector<SamplePlacementStrategy, SamplePlacementStrategyFixedSiloDirector>();
}
Para ver un segundo ejemplo simple que muestra el uso posterior del contexto de ubicación, consulte PreferLocalPlacementDirector
en el Orleans repositorio de origen.