Pergunta

Eu estou tentando descobrir a dificuldade de implementar um sistema de fila. Eu sei como implementar uma fila básico, então eu vou explicar um pouco sobre o que eu sou depois com algum fundo:

vou implementar uma fila onde as mensagens serão colocadas, este virá de vários usuários, as mensagens serão programado para ser publicado em horários definidos pelo usuário (várias ocorrências são permitidos com a precisão de minutos, a partir de uma perspectiva UI i será restringir: "a cada minuto ou a cada hora" ocorrências, mas id como o sistema de ainda ser capaz de lidar com isso).

Aqui é onde a minha pergunta vem: Eventualmente eu possa estar em uma situação (e talvez não), onde muitas mensagens precisam ser postado no momento atual, eu gostaria de ter vários processos (várias instâncias de um script) que funcionam para buscar [x, 10,25] Número de mensagens da fila de cada vez e processá-los. O problema é: como fazer isso de modo que cada instância processa mensagens exclusivas (sem processar algo que já está sendo processada por outra instância)? Estou preocupado com conexões atuais, como bloquear registros, e qualquer outra coisa que não pode estar pensando.

Technologies eu estarei usando são PHP e MySQL. Estou à procura de algumas soluções para os acima, termos que eu deveria estar usando em minhas pesquisas, exemplos do mundo real, pensamentos, comentários e ideias?

Graças a todos!

Uma solução me deparei estava usando Amazon simples Queue Service ... que promete processamento de mensagens única / bloqueio http : //aws.amazon.com/sqs/

Foi útil?

Solução

Bem, eu faria assim:

Faça a sua mesa para mensagens e adicionar mais dois campos - "PROCESS_ID" e "PROCESS_TIME". Estes serão explicados mais tarde.

Dê a cada processo uma identificação única. Eles podem gerá-lo na inicialização (como um GUID), ou você pode atribuí-los a si mesmo (então você pode distingui-los mais facilmente).

Quando um processo quer buscar um monte de mensagens, que, em seguida, faz algo parecido com isto:

  1. UPDATE messages SET process_id=$id, process_time=now() where process_id is null LIMIT 20
  2. * SELECT FROM mensagens onde process_id = $ id

Este vai encontrar 20 mensagens "livre" e "bloqueio"-los. Em seguida, ele irá encontrar as mensagens que ele bloqueado e processá-los. Depois de cada mensagem é processada, DELETE-lo.

A instrução UPDATE deve ser bastante atômica, especialmente se você usar InnoDB, que envolve cada tal afirmação em uma transação automaticamente. MySQL deve cuidar de toda a concorrência lá.

O campo PROCESS_TIME é opcional, mas você pode usar isso para ver quando um processo tem enforcado. Se uma mensagem é bloqueada por muito tempo, você pode concluir que algo deu errado e investigar.

Outras dicas

Você pode contornar o problema.

Em vez de ter o problema de fazer as coisas fora da fila, ao mesmo tempo. Publicar todas as informações assim que você obtê-lo. Mas publicá-lo com uma regra que não é suposto para ser visível até um certo tempo. Fazer as coisas desta forma poderia ajudá-lo a evitar o bloqueio / problemas de contenção.

Tenha um olhar para o Beanstalkd fila de mensagens. Existem clientes PHP para ele. Um dos recursos mais interessantes do Beanstalkd (ao contrário por exemplo dropr) é que você pode atrasar mensagens. Ou seja, você pode enviar uma mensagem para a fila e não será entregue a um cliente até X segundos se passaram.

Beanstalkd tem uma grande desvantagem no entanto: É uma fila na memória. Isso significa que se ele (ou sua máquina) falha seguida, a fila está vazia e os conteúdos perdidos. Persistência é um recurso previsto para a próxima versão do beanstalkd.

Casal de soluções on-line:

  1. Amazon SQS .
  2. fila appengine Google sistema

Eu acho que a solução do Google é muito mais barato (Poderia até mesmo ser livre se não utilizar muito).

Eu também estive pensando sobre a implementação de fila em PHP / MySQL e pensou em usar:

  1. GET_LOCK para implementar algum tipo de bloqueio.
  2. Coloque o no MYSQL pilha DataStorage, porque na memória fila é muito mais rápido, em seguida, na fila de disco. Mas você tem o risco de perda de dados quando o computador deixa de funcionar.
  3. pipes nomeados para se comunicar com processos.
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top