A questão mais importante a ser abordada é como você lida com um funcionário que morre ao processar um item da fila.
Enquanto um trabalhador está processando um item, normalmente você não quer que ele ainda esteja na fila para processamento de outros funcionários. Por outro lado, se o item for removido da fila e apenas o trabalhador souber do item que está sendo processado, essa informação será perdida se o trabalhador travar.
Também é complicado saber se um trabalhador falhou. Muitas vezes, um tempo limite pode ser usado como uma aproximação suficientemente boa para saber se um trabalhador caiu. Mas quantos trabalhadores você permitirá tentar processar esse item? Se você tiver um bug dependente de dados, há um risco de que tentar novamente em um worker diferente apenas faça com que o próximo worker morra. Se você não levar isso em conta, todos os seus funcionários podem falhar. Por outro lado, se um trabalhador caiu devido a uma falha de hardware, você provavelmente não quer perder o item que estava processando no momento.
Se você já resolveu todos os itens acima, então você resolveu a maioria dos riscos associados ao canário. Nesse ponto, você pode decidir simplesmente deixar o canário se comportar como qualquer outro trabalhador.
Existe, no entanto, o risco potencial da nova versão fornecer dados corrompidos. Se o processamento for determinístico, você pode permitir que a versão antiga e o canário processem a mesma entrada e comparem as saídas. Como implementar isso depende do design geral do sistema, em alguns sistemas a solução pode ser fazer com que os funcionários insiram uma pequena porcentagem de itens já processados em uma fila de canários, onde seus canários podem fazer o mesmo processamento novamente e você pode comparar os resultados.