Configurar o comportamento do buffer de mensagens com suporte em disco
Importante
Essa configuração exige a modificação do recurso Agente e só pode ser definida no momento da implantação inicial com a CLI do Azure ou o portal do Azure. Uma nova implantação será necessária se forem necessárias alterações na configuração do Agente. Para saber mais, confira Personalizar o Agente padrão.
O recurso buffer de mensagens com suporte em disco é usado para o gerenciamento eficiente de filas de mensagens no agente MQTT distribuído. Os benefícios incluem:
Gerenciamento eficiente de filas: em um Agente MQTT, cada assinante está associado a uma fila de mensagens. A velocidade com que um assinante processa mensagens impacta diretamente o tamanho da fila. Se um assinante processa mensagens lentamente ou se desconectam, mas solicitam uma sessão persistente de MQTT, a fila pode ficar maior do que a memória disponível.
Preservação de dados para sessões persistentes: o recurso buffer de mensagens com suporte em disco garante que, quando uma fila exceder a memória disponível, ela será perfeitamente armazenada em buffer no disco. Esse recurso evita a perda de dados e dá suporte a sessões persistentes de MQTT, permitindo que os assinantes retomem suas sessões com suas filas de mensagens intactas após a reconexão. O disco é usado como armazenamento efêmero e serve como um excedente da memória. Os dados gravados no disco não são duráveis e são perdidos quando o pod é encerrado, mas desde que pelo menos um pod em cada cadeia de back-end permaneça funcional, o agente como um todo não perderá nenhum dado.
Lidar com desafios de conectividade: os conectores de nuvem são tratados como assinantes com sessões persistentes que podem enfrentar desafios de conectividade quando não conseguem se comunicar com sistemas externos, como o Agente MQTT da Grade de Eventos devido à desconexão da rede. Nesses cenários, as mensagens (PUBLISHes) se acumulam. O Agente MQTT armazena essas mensagens em buffer de maneira inteligente na memória ou no disco até que a conectividade seja restaurada, garantindo a integridade da mensagem.
Por padrão, o recurso de buffer de mensagens com suporte em disco fica desabilitado. Nesse caso, as mensagens permanecem na memória, e a pressão de retorno é aplicada aos clientes à medida que o pool de leitores ou pool temporário atinge o limite definido pelo limite de fila do assinante.
A configuração do buffer de mensagens com suporte em disco é essencial para manter um sistema de enfileiramento de mensagens robusto e confiável, especialmente em cenários em que a velocidade e a conectividade do processamento de mensagens são críticas.
Observação
O agente MQTT grava os dados no disco exatamente como são recebidos dos clientes, sem criptografia adicional. Proteger o disco é essencial para proteger os dados armazenados pelo agente.
Opções de configuração
Para configurar o buffer de mensagens com suporte em disco, edite a seção diskBackedMessageBuffer
no recurso Agente. Atualmente, só há suporte para isso usando o sinalizador --broker-config-file
ao implantar as Operações do Azure IoT usando o comando az iot ops create
.
Para começar, prepare um arquivo de configuração do Agente seguindo a referência da API DiskBackedMessageBuffer.
Por exemplo, a configuração mais simples envolve especificar apenas o tamanho máximo. Nesse caso, é montado um volume emptyDir
. O valor maxSize
é usado como o limite de tamanho do volume emptyDir
. Mas essa é a opção de menor preferência, dadas as limitações do volume emptyDir
.
{
"diskBackedMessageBuffer": {
"maxSize": "<SIZE>"
}
}
Para obter uma configuração melhor do buffer de mensagens com suporte em disco, especifique um volume efêmero ou uma declaração de volume persistente para montar um volume de armazenamento dedicado para o buffer de mensagens. Por exemplo:
{
"diskBackedMessageBuffer": {
"maxSize": "<SIZE>",
"ephemeralVolumeClaimSpec": {
"storageClassName": "<NAME>",
"accessModes": [
"<MODE>"
]
}
}
}
{
"persistentVolumeClaimSpec": {
"maxSize": "<SIZE>",
"ephemeralVolumeClaimSpec": {
"storageClassName": "<NAME>",
"accessModes": [
"<MODE>"
]
}
}
}
Adapte as opções do buffer de mensagens do agente ajustando as seguintes configurações:
Configurar o volume: especifique um modelo de solicitação de volume para montar um volume de armazenamento dedicado para o buffer de mensagens.
Selecione uma classe de armazenamento: defina o StorageClass desejado usando a propriedade
storageClassName
.Definir modos de acesso: determine os modos de acesso necessários para o seu volume. Para obter mais informações, confira modos de acesso a volumes persistentes.
Use as seções a seguir para entender os diferentes modos de volume:
- O volume efêmero é a opção preferencial;
- O volume persistente é o próximo preferido; e
- O volume
emptyDir
é o de menor preferência.
Tanto o volume persistente quanto o efêmero são geralmente fornecidos pelas mesmas classes de armazenamento. Se ambas as opções estiverem disponíveis, escolha o efêmero. Observe que os volumes efêmeros exigem o Kubernetes 1.23 ou superior.
Dica
Especificar um modelo de EVC (Declaração de volume efêmero) ou PVC (Declaração de volume persistente) permite que você use uma classe de armazenamento de sua escolha, aumentando a flexibilidade para alguns cenários de implantação. Por exemplo, PVs (Volumes persistentes) provisionados usando um modelo de PVC aparecem em comandos como kubectl get pv
, o que pode ser útil para inspecionar o estado do cluster.
Se os nós do Kubernetes não tiverem espaço suficiente no disco local para o buffer de mensagens, use uma classe de armazenamento que forneça armazenamento de rede como Blobs do Azure. No entanto, geralmente é melhor usar o disco local com um valor menor maxSize
, pois o buffer de mensagens se beneficia do acesso rápido e não requer durabilidade.
Implantar Operações do Azure IoT com buffer de mensagens com suporte em disco
Para usar o buffer de mensagens com suporte em disco, implante as Operações do Azure IoT usando o comando az iot ops create
com o sinalizador --broker-config-file
. Consulte o seguinte comando (outros parâmetros omitidos para fins de brevidade):
az iot ops create ... --broker-config-file <FILE>.json
Essa configuração não pode ser alterada após a implantação. Para alterar a configuração do buffer de mensagens com suporte em disco, reimplante a instância de Operações do Azure IoT.
Volume efêmero
O volume efêmero é a opção preferencial para o buffer de mensagens.
Para volumes efêmeros, siga os conselhos na seção Considerações para provedores de armazenamento.
O valor da propriedade ephemeralVolumeClaimSpec
é usado como a propriedade ephemeral.volumeClaimTemplate.spec
do volume nas especificações StatefulSet das cadeias de back-end.
Por exemplo, para usar um volume efêmero com capacidade de 1 gigabyte, especifique os seguintes parâmetros no seu recurso Agente:
{
"diskBackedMessageBuffer": {
"maxSize": "1G",
"ephemeralVolumeClaimSpec": {
"storageClassName": "foo",
"accessModes": [
"ReadWriteOnce"
]
}
}
}
Volume persistente
O volume persistente é a próxima opção preferencial para o buffer de mensagens após o volume efêmero.
Para volume persistente, siga os conselhos na seção Considerações para provedores de armazenamento.
O valor da propriedade persistentVolumeClaimSpec
é usado como a propriedade volumeClaimTemplates.spec
nas especificações StatefulSet das cadeias de back-end.
Por exemplo, para usar um volume persistente com capacidade de 1 gigabyte, especifique os seguintes parâmetros em seu recurso Agente:
{
"diskBackedMessageBuffer": {
"maxSize": "1G",
"persistentVolumeClaimSpec": {
"storageClassName": "foo",
"accessModes": [
"ReadWriteOnce"
]
}
}
}
volumeemptyDir
Um volume emptyDir é a última opção preferencial após o volume persistente.
Use apenas o volume emptyDir ao usar um cluster com cotas de sistema de arquivos. Para obter mais informações, confira os detalhes na guia cota do projeto do sistema de arquivos. Se o recurso não estiver habilitado, o cluster faz uma verificação periódica que não impõe nenhum limite e permite que o nó do host preencha o espaço em disco e marque todo o nó do host como não íntegro.
Por exemplo, para usar um volume emptyDir com capacidade de 1 gigabyte, especifique os seguintes parâmetros em seu recurso Agente:
{
"diskBackedMessageBuffer": {
"maxSize": "1G"
}
}
Considerações para provedores de armazenamento
Considere o comportamento do provedor de armazenamento escolhido. Por exemplo, ao usar provedores como rancher.io/local-path
. Se o provedor não dá suporte a limites, o preenchimento do volume consumirá o espaço em disco do nó. Isso pode fazer com que o Kubernetes marque o nó e todos os pods associados como não íntegros. É crucial entender como seu provedor de armazenamento se comporta nesses cenários.
Desabilitadas
Se você não quiser usar o buffer de mensagens com suporte em disco, não inclua a propriedade diskBackedMessageBufferSettings
em seu recurso Agente. Esse também é o comportamento padrão.
Persistência
É importante entender que o recurso de buffer de mensagens com suporte em disco não é sinônimo de persistência. Nesse contexto, persistência refere-se aos dados que sobrevivem após a reinicializações do pod. No entanto, esse recurso fornece espaço de armazenamento temporário para que os dados sejam salvos em disco, evitando estouros de memória e perda de dados durante a reinicialização do pod.