Estou ocupado escrevendo um aplicativo Python usando o ZeroMQ e implementando uma variação do padrão Majordomo, conforme descrito no ZGuide .
Eu tenho um corretor como intermediário entre um conjunto de trabalhadores e clientes. Desejo fazer um registro extensivo para cada solicitação recebida, mas não quero que o corretor perca tempo fazendo isso. O intermediário deve passar essa solicitação de log para outra coisa.
Eu pensei em duas maneiras: -
- Crie trabalhadores que são apenas para log e use o transporte ZeroMQ IPC
- Usar multiprocessamento com uma fila
Não tenho certeza de qual é o melhor ou o mais rápido para esse assunto. A primeira opção permite que eu use as classes base de trabalhadores atuais que eu já uso para trabalhadores normais, mas a segunda opção parece mais rápida de implementar.
Gostaria de alguns conselhos ou comentários sobre o acima exposto ou possivelmente uma solução diferente.
fonte
Você pode considerar uma terceira possibilidade para implementar o log remoto. Se você usar o módulo de log Python padrão, poderá considerar o uso da
logging.QueueHandler
classe em seus trabalhadores, clientes e broker e alogging.QueueListener
classe em seu processo de log remoto.Em vez de usar o Python normal
multiprocessing.Queue
como o transporte entre os processos de seu aplicativo e o processo de log, implemente sua própriaQueue
classe de substituição usando o ZeroMQ com digitação de pato para que sua classe seja um substituto para o Python padrãoQueue
. Dessa maneira, seu aplicativo poderá ser executado inalterado em qualquer ambiente, a partir de um único computador com vários núcleos, por meio de data centers distribuídos.Para resumir, use um logger padrão do Python com a
QueueHandler
em todos os seus funcionários, clientes e corretores e crie um processo independente com base no (s) manipulador (es)QueueListener
Pythonlogging
de sua escolha para lidar com o trabalho pesado do log.fonte
Essas são abordagens radicalmente diferentes, cada uma com seus próprios conjuntos de prós e contras, que você provavelmente verá em uma fase posterior do desenvolvimento:
Uma maneira de tentar tentar é ter um trabalhador de log adicional, como na abordagem 1. Você pode permitir que seus trabalhadores façam logon em um cluster de log do memcache, e o trabalhador de log monitora a carga atual de recursos e, ao decedir um determinado parâmetro de carga de recursos, o trabalhador registra em um dispositivo limitado de IOPs (por exemplo, disco rígido).
Também gosto da abordagem de Jonathan com a ressalva de que eu também uso principalmente o Python 2.x e que você provavelmente precisará configurar seu próprio back-end de log para realmente forçar o desempenho.
Corrija-me se eu estiver errado, mas minha opinião é que você está realizando alguma tarefa com muitos dados, com as IOPs de armazenamento sendo seu gargalo.
Uma maneira conveniente ainda seria permitir que o broker faça o
brokerage
log - no formato descrito - com todas as desvantagens de uma instância central do broker. Por exemplo, se o broker estiver em uma demanda tão alta que nunca tenha espaço para gravar os logs do cache de memórias de volta ao armazenamento, você precisará adotar outra abordagem.Você pode acabar tendo um modelo sem corretor. Isso é com os trabalhadores gerenciando seu trabalho entre si. Em um exemplo simples, por meio de um algoritmo de round-robin distribuído .
fonte