Сокет ввода-вывода не работает с несколькими узловыми серверами js

#node.js #socket.io #amazon-elastic-beanstalk

Вопрос:

У меня есть 3 сервера на AWS.

Когда

пользователь А подключается к серверу 1 и

пользователь B подключается к серверу 2

они не могут присоединиться или пообщаться. Но если оба подключаются к одному и тому же серверу, то они успешно подключаются.

Каков был бы лучший способ справиться с этой ситуацией

В AWS я использую балансировщик нагрузки с автоматическим масштабированием.

Комментарии:

1. Вы читали это: socket.io/docs/using-multiple-nodes ? Если да, то чего вы в этом не поняли? Похоже, он разработан для вашей конкретной ситуации.

Ответ №1:

Из socket.io документации:

Теперь, когда у вас есть несколько сокетов.Узлы ввода-вывода, принимающие подключения, если вы хотите транслировать события всем (или даже всем в определенной комнате), вам понадобится какой-то способ передачи сообщений между процессами или компьютерами.

Интерфейс, отвечающий за маршрутизацию сообщений, — это то, что мы называем Адаптером. Вы можете реализовать свой собственный поверх адаптера socket.io (унаследовав его) или использовать тот, который мы предоставляем поверх Redis: socket.io-redis:

Внедрение адаптера Redis в нашу розетку.приложение с поддержкой ввода-вывода для горизонтального масштабирования-это всего лишь несколько строк добавленного кода в index.js файл:

 var io = require('socket.io')(3000);
var redis = require('socket.io-redis');
io.adapter(redis({ host: 'localhost', port: 6379 }));
 

Чтобы включить автоматическое масштабирование в вашем приложении, добавьте scaling-policy.yml в файл следующую строку кода

 # Enable autoscaling for the service
ScalableTarget:
  Type: AWS::ApplicationAutoScaling::ScalableTarget
  DependsOn: Service
  Properties:
    ServiceNamespace: 'ecs'
    ScalableDimension: 'ecs:service:DesiredCount'
    ResourceId:
      Fn::Join:
        - '/'
        - - service
          - Fn::ImportValue: !Join [':', [!Ref 'EnvironmentName', 'ClusterName']]
          - !Ref 'ServiceName'
    MinCapacity: 2
    MaxCapacity: 10
    RoleARN:
      Fn::ImportValue:
        !Join [':', [!Ref 'EnvironmentName', 'AutoscalingRole']]

# Create scaling policies for the service
ScaleDownPolicy:
  Type: AWS::ApplicationAutoScaling::ScalingPolicy
  DependsOn: ScalableTarget
  Properties:
    PolicyName:
      Fn::Join:
        - '/'
        - - scale
          - !Ref 'EnvironmentName'
          - !Ref 'ServiceName'
          - down
    PolicyType: StepScaling
    ResourceId:
      Fn::Join:
        - '/'
        - - service
          - Fn::ImportValue: !Join [':', [!Ref 'EnvironmentName', 'ClusterName']]
          - !Ref 'ServiceName'
    ScalableDimension: 'ecs:service:DesiredCount'
    ServiceNamespace: 'ecs'
    StepScalingPolicyConfiguration:
      AdjustmentType: 'ChangeInCapacity'
      StepAdjustments:
        - MetricIntervalUpperBound: 0
          ScalingAdjustment: -1
      MetricAggregationType: 'Average'
      Cooldown: 60

ScaleUpPolicy:
  Type: AWS::ApplicationAutoScaling::ScalingPolicy
  DependsOn: ScalableTarget
  Properties:
    PolicyName:
      Fn::Join:
        - '/'
        - - scale
          - !Ref 'EnvironmentName'
          - !Ref 'ServiceName'
          - up
    PolicyType: StepScaling
    ResourceId:
      Fn::Join:
        - '/'
        - - service
          - Fn::ImportValue: !Join [':', [!Ref 'EnvironmentName', 'ClusterName']]
          - !Ref 'ServiceName'
    ScalableDimension: 'ecs:service:DesiredCount'
    ServiceNamespace: 'ecs'
    StepScalingPolicyConfiguration:
      AdjustmentType: 'ChangeInCapacity'
      StepAdjustments:
        - MetricIntervalLowerBound: 0
          MetricIntervalUpperBound: 15
          ScalingAdjustment: 1
        - MetricIntervalLowerBound: 15
          MetricIntervalUpperBound: 25
          ScalingAdjustment: 2
        - MetricIntervalLowerBound: 25
          ScalingAdjustment: 3
      MetricAggregationType: 'Average'
      Cooldown: 60

# Create alarms to trigger these policies
LowCpuUsageAlarm:
  Type: AWS::CloudWatch::Alarm
  Properties:
    AlarmName:
      Fn::Join:
        - '-'
        - - low-cpu
          - !Ref 'EnvironmentName'
          - !Ref 'ServiceName'
    AlarmDescription:
      Fn::Join:
        - ' '
        - - "Low CPU utilization for service"
          - !Ref 'ServiceName'
          - "in stack"
          - !Ref 'EnvironmentName'
    MetricName: CPUUtilization
    Namespace: AWS/ECS
    Dimensions:
      - Name: ServiceName
        Value: !Ref 'ServiceName'
      - Name: ClusterName
        Value:
          Fn::ImportValue: !Join [':', [!Ref 'EnvironmentName', 'ClusterName']]
    Statistic: Average
    Period: 60
    EvaluationPeriods: 1
    Threshold: 20
    ComparisonOperator: LessThanOrEqualToThreshold
    AlarmActions:
      - !Ref ScaleDownPolicy

HighCpuUsageAlarm:
  Type: AWS::CloudWatch::Alarm
  Properties:
    AlarmName:
      Fn::Join:
        - '-'
        - - high-cpu
          - !Ref 'EnvironmentName'
          - !Ref 'ServiceName'
    AlarmDescription:
      Fn::Join:
        - ' '
        - - "High CPU utilization for service"
          - !Ref 'ServiceName'
          - "in stack"
          - !Ref 'EnvironmentName'
    MetricName: CPUUtilization
    Namespace: AWS/ECS
    Dimensions:
      - Name: ServiceName
        Value: !Ref 'ServiceName'
      - Name: ClusterName
        Value:
          Fn::ImportValue: !Join [':', [!Ref 'EnvironmentName', 'ClusterName']]
    Statistic: Average
    Period: 60
    EvaluationPeriods: 1
    Threshold: 70
    ComparisonOperator: GreaterThanOrEqualToThreshold
    AlarmActions:
      - !Ref ScaleUpPolicy