Проблемы с транзакциями Rest API Marklogic с балансировщиком нагрузки

#session-cookies #marklogic #aws-load-balancer

Вопрос:

Мы используем Rest Api MarkLogic для отправки/обновления данных на сервер базы данных marlogic. Также мы используем транзакции для фиксации/отката нескольких операторов. Поэтому, когда мы передаем запрос через балансировщик нагрузки в marklogic, чтобы получить идентификатор транзакции и связать этот идентификатор транзакции с последующими запросами, и, наконец, мы пытаемся зафиксировать запрос с тем же идентификатором транзакции, но балансировщик нагрузки выдает ошибочный запрос (балансировщик нагрузки не распознает запрос, поскольку он не выполняется).

  1. Мы создаем транзакции, позвонив http://host:port/version/transactions API с помощью метода POST, и это вернет идентификатор транзакции в заголовке ответа о местоположении.
  2. Затем мы свяжем идентификатор транзакции с вставкой/обновлением документа через eval (http://host:port/version/eval) служебный api.
  3. После этого зафиксируйте транзакцию, созданную путем отправки запроса на публикацию в службу /transactions, отправьте запрос на публикацию в службу /transactions/{txid} с URL-адресом формы: http://host:port/version/transactions/txid?result=outcome

Как получить файл cookie сеанса из балансировщика нагрузки ? Как передать это последующим запросам с помощью кода c#?

Ответ №1:

Общая схема настройки балансировщика нагрузки описана здесь:

https://docs.marklogic.com/guide/rest-dev/transactions#id_42381

Вопросы по настройке конкретного балансировщика нагрузки лучше всего направлять поставщику или сообществу для этого балансировщика нагрузки.

С другой стороны, конечную точку eval следует использовать только для удобства во время разработки, а не в процессе производства из-за угрозы безопасности.

В качестве альтернативы рассмотрите возможность установки основного модуля и использования конечной точки invoke или конечной точки готовых документов.

Надеюсь, это поможет,

Ответ №2:

Вам необходимо включить привязку сеанса (или привязку сеанса) в балансировщике нагрузки для файла cookie SessionID и убедиться, что он поддерживается и используется клиентом (c#).

Для вашего ELB пример приведен в разделе Объявление ресурсов руководства MarkLogic Server по веб-службам Amazon (AWS).

ElasticLoadBalancer-это балансировщик нагрузки для всех ASG. Дополнительные сведения о типе AWS::ElasticLoadBalancing::Балансировщик нагрузки см. в разделе http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-elb.html.

 ElasticLoadBalancer:
    Type: 'AWS::ElasticLoadBalancing::LoadBalancer'
    DependsOn:
      - VpcStack
      - ElbSecurityGroup
    Properties:
      AppCookieStickinessPolicy:
        - CookieName: SessionID
          PolicyName: MLSession
      SecurityGroups:
        - !Ref ElbSecurityGroup
      Subnets:
        - !GetAtt [VpcStack, Outputs.PublicSubnet1Id]
        - !If [MultiZone, !GetAtt [VpcStack, Outputs.PublicSubnet2Id], !Ref 'AWS::NoValue']
        - !If [MultiZone, !GetAtt [VpcStack, Outputs.PublicSubnet3Id], !Ref 'AWS::NoValue']
      ConnectionDrainingPolicy:
        Enabled: 'true'
        Timeout: '60'
      CrossZone: 'true'
 

Управление транзакциями При использовании балансировщика нагрузки

Этот раздел применяется только к клиентским приложениям, которые используют транзакции с несколькими операторами и взаимодействуют с кластером серверов MarkLogic через балансировщик нагрузки. Дополнительные рекомендации по балансировке нагрузки общего назначения см. в разделе Подключение с помощью балансировщика нагрузки.

При использовании балансировщика нагрузки запросы от вашего приложения к серверу MarkLogic могут направляться на разные хосты даже в рамках одного сеанса. Это не влияет на большинство взаимодействий с сервером MarkLogic, но операции, являющиеся частью одной и той же транзакции с несколькими операторами, должны быть перенаправлены на один и тот же хост в кластере MarkLogic. Эта согласованная маршрутизация через балансировщик нагрузки называется привязкой к сеансу.

Большинство балансировщиков нагрузки предоставляют механизм, поддерживающий сходство сеансов. Обычно это принимает форму файла cookie сеанса, который создается в балансировщике нагрузки. Клиент получает файл cookie от балансировщика нагрузки и передает его по любым запросам, относящимся к сеансу. Точные шаги, необходимые для настройки балансировщика нагрузки для создания файлов cookie сеанса, зависят от балансировщика нагрузки. Для получения подробной информации обратитесь к документации по балансировщику нагрузки.

Для балансировщика нагрузки сеанс соответствует сеансу браузера, как определено в RFC 2109 (https://www.ietf.org/rfc/rfc2109.txt). Однако в контексте приложения Java Client API, использующего транзакции с несколькими операторами, сеанс соответствует одной транзакции с несколькими операторами.

API клиента Java использует файл cookie сеанса для сохранения сходства хоста между операциями в транзакции с несколькими операторами следующим образом. Этот процесс прозрачен для вашего приложения; информация предоставляется для иллюстрации ожидаемого поведения балансировщика нагрузки.

  1. При создании транзакции с помощью DatabaseClient.openTransaction API клиента Java получает идентификатор транзакции от MarkLogic и , если балансировщик нагрузки настроен правильно, файл cookie сеанса от балансировщика нагрузки. Эта информация кэшируется в объекте транзакции.
  2. Каждый раз, когда вы выполняете операцию API клиента Java, которая включает объект транзакции, API клиента Java прикрепляет идентификатор транзакции и файл cookie сеанса к запросу(запросам), который он отправляет в MarkLogic. Файл cookie сеанса заставляет балансировщик нагрузки перенаправлять запрос на тот же хост в кластере MarkLogic, который создал транзакцию.
  3. Когда MarkLogic получает запрос, он игнорирует файл cookie сеанса (если таковой имеется), но использует идентификатор транзакции, чтобы убедиться, что операция является частью запрошенной транзакции. Когда MarkLogic отвечает, балансировщик нагрузки снова добавляет файл cookie сеанса, который API клиента Java кэширует в объекте транзакции.
  4. Когда вы фиксируете или откатываете транзакцию, все файлы cookie, возвращаемые балансировщиком нагрузки, удаляются, поскольку транзакция больше не действительна. Это эффективно завершает сеанс с точки зрения балансировщика нагрузки, поскольку API клиента Java больше не будет передавать файл cookie сеанса.

Любая операция API клиента Java, которая не включает объект транзакции, не будет включать файл cookie сеанса (или идентификатор транзакции) в запрос к MarkLogic, поэтому балансировщик нагрузки может направить запрос на любой хост в вашем кластере MarkLogic.