Persistir o estado no Linux

Os tópicos e as assinaturas criados no módulo da Grade de Eventos são armazenados no sistema de arquivos de contêiner por padrão. Sem persistência, se o módulo for reimplantado, todos os metadados criados serão perdidos. Para preservar os dados entre implantações e reinicializações, você precisa manter os dados fora do sistema de arquivos do contêiner.

Por padrão, somente os metadados persistem, e os eventos ainda são armazenados na memória para melhorar o desempenho. Siga a seção persistir eventos para habilitar a persistência de eventos também.

Este artigo mostra as etapas para implantar o módulo de Grade de Eventos com persistência em implantações do Linux.

Observação

O módulo de Grade de Eventos é executado como um usuário com privilégios baixos com UID 2000 e nome eventgriduser.

Persistência por meio de montagem de volume

Os volumes do Docker são usados para preservar dados entre implantações. Você pode permitir que o Docker crie automaticamente um volume nomeado como parte da implantação do módulo da Grade de Eventos. Essa opção é a mais simples. Você pode especificar o nome do volume a ser criado na seção Binds da seguinte forma:

  {
     "HostConfig": {
          "Binds": [
                 "<your-volume-name-here>:/app/metadataDb"
           ]
      }
   }

Importante

Não altere a segunda parte do valor de associação. Ele aponta para um local específico dentro do módulo. Para o módulo da Grade de Eventos no Linux, ele deve ser /app/metadataDb.

Por exemplo, a configuração a seguir resultará na criação do volume egmetadataDbVol em que os metadados serão persistentes.

 {
  "Env": [
    "inbound__serverAuth__tlsPolicy=strict",
    "inbound__serverAuth__serverCert__source=IoTEdge",
    "inbound__clientAuth__sasKeys__enabled=false",
    "inbound__clientAuth__clientCert__enabled=true",
    "inbound__clientAuth__clientCert__source=IoTEdge",
    "inbound__clientAuth__clientCert__allowUnknownCA=true",
    "outbound__clientAuth__clientCert__enabled=true",
    "outbound__clientAuth__clientCert__source=IoTEdge",
    "outbound__webhook__httpsOnly=true",
    "outbound__webhook__skipServerCertValidation=false",
    "outbound__webhook__allowUnknownCA=true"
  ],
  "HostConfig": {
    "Binds": [
      "egmetadataDbVol:/app/metadataDb",
      "egdataDbVol:/app/eventsDb"
    ],
    "PortBindings": {
      "4438/tcp": [
        {
          "HostPort": "4438"
        }
      ]
    }
  }
}

Em vez de montar um volume, você pode criar e montar um diretório no sistema host.

Persistência via montagem de diretório de host

Em vez de um volume do Docker, você também tem a opção de montar uma pasta de host.

  1. Primeiro, crie um usuário com o nome eventgriduser e a ID 2000 no computador host executando o seguinte comando:

    sudo useradd -u 2000 eventgriduser
    
  2. Execute o comando abaixo para criar um diretório no sistema de arquivos de host.

    md <your-directory-name-here>
    

    Por exemplo, executar o comando a seguir criará um diretório chamado myhostdir.

    md /myhostdir
    
  3. Em seguida, torne eventgriduser o proprietário dessa pasta executando o comando a seguir.

    sudo chown eventgriduser:eventgriduser -hR <your-directory-name-here>
    

    Por exemplo,

    sudo chown eventgriduser:eventgriduser -hR /myhostdir
    
  4. Use Associações para montar o diretório e reimplantar o módulo da Grade de Eventos do portal do Azure.

    {
         "HostConfig": {
            "Binds": [
                "<your-directory-name-here>:/app/metadataDb",
                "<your-directory-name-here>:/app/eventsDb",
             ]
         }
    }
    

    Por exemplo,

    {
          "Env": [
            "inbound__serverAuth__tlsPolicy=strict",
            "inbound__serverAuth__serverCert__source=IoTEdge",
            "inbound__clientAuth__sasKeys__enabled=false",
            "inbound__clientAuth__clientCert__enabled=true",
            "inbound__clientAuth__clientCert__source=IoTEdge",
            "inbound__clientAuth__clientCert__allowUnknownCA=true",
            "outbound__clientAuth__clientCert__enabled=true",
            "outbound__clientAuth__clientCert__source=IoTEdge",
            "outbound__webhook__httpsOnly=true",
            "outbound__webhook__skipServerCertValidation=false",
            "outbound__webhook__allowUnknownCA=true"
          ],
          "HostConfig": {
                "Binds": [
                  "/myhostdir:/app/metadataDb",
                  "/myhostdir2:/app/eventsDb"
                ],
                "PortBindings": {
                      "4438/tcp": [
                        {
                          "HostPort": "4438"
                        }
                      ]
                }
          }
    }
    

    Importante

    Não altere a segunda parte do valor de associação. Ele aponta para um local específico dentro do módulo. Para o módulo da Grade de Eventos no Linux, ele deve ser /app/metadataDb e /app/eventsDb

Persistir eventos

Para habilitar a persistência de eventos, primeiro você deve habilitar a persistência de metadados por meio da montagem de volume ou da montagem de diretório de host usando as seções acima.

Fatores importantes a serem observados sobre eventos persistentes:

  • A persistência de eventos é habilitada por assinatura de evento e é opcional quando um volume ou diretório é montado.
  • A persistência de evento é configurada em uma assinatura de evento no momento da criação e não pode ser modificada depois que a assinatura do evento é criada. Para alternar a persistência de evento, você deve excluir e recriar a assinatura de evento.
  • A persistência de eventos é quase sempre mais lenta do que nas operações de memória, no entanto, a diferença de velocidade depende muito das características da unidade. A compensação entre velocidade e confiabilidade é inerente a todos os sistemas de mensagens, mas, geralmente, só se torna perceptível em grande escala.

Para habilitar a persistência de evento em uma assinatura de evento, defina persistencePolicy como true:

       {
         "properties": {
           "persistencePolicy": {
             "isPersisted": "true"
           },
           "destination": {
             "endpointType": "WebHook",
             "properties": {
               "endpointUrl": "<your-webhook-url>"
             }
           }
         }
       }