Wednesday, 19 July 2017

Zeromq Binary Options


3 anos mais tarde, uma nota para as pessoas que navegam aqui. Pense em POR QUE você deseja usar middleware de enfileiramento de mensagens. Se a razão for distribuir tarefas dentro de um cluster, olhe para Celery. Ele opera em um nível de abstração superior ao das soluções de estilo MQ, usa RabbitMQ para mover mensagens, mas tem excelente suporte para semânticas específicas de tarefas. Ndash Chris Johnson Aug 28 13 em 20:22 17 Respostas Editar: Minha resposta inicial tinha um forte foco em AMQP. Eu decidi reescrevê-lo para oferecer uma visão mais ampla sobre o tema. Estas 3 tecnologias de mensagens têm abordagens diferentes na construção de sistemas distribuídos: RabbitMQ é uma das principais implementações do protocolo AMQP (juntamente com o Apache Qpid). Portanto, implementa uma arquitetura de intermediário, o que significa que as mensagens são enfileiradas em um nó central antes de serem enviadas para os clientes. Essa abordagem torna o RabbitMQ muito fácil de usar e implantar, pois cenários avançados como roteamento, balanceamento de carga ou fila persistente de mensagens são suportados em apenas algumas linhas de código. No entanto, também torna menos escalável e mais lento porque o nó central adiciona latência e envelopes de mensagem são bastante grandes. ZeroMq é um sistema de mensagens muito leve projetado especialmente para cenários de alto rendimento / baixa latência como o que você pode encontrar no mundo financeiro. Zmq suporta muitos cenários avançados de mensagens, mas ao contrário do RabbitMQ, você terá que implementar a maioria deles sozinho, combinando várias partes da estrutura (por exemplo, soquetes e dispositivos). Zmq é muito flexível, mas você terá que estudar as 80 páginas ou mais do guia (que eu recomendo leitura para qualquer pessoa escrevendo sistema distribuído, mesmo se você não usar Zmq) antes de ser capaz de fazer algo mais complicado do que enviar mensagens entre 2 pares. O ActiveMQ está no meio-termo. Como o Zmq, ele pode ser implantado com topologias de corretor e P2P. Como o RabbitMQ, é mais fácil implementar cenários avançados, mas geralmente ao custo do desempenho bruto. É a faca suíça de mensagens :-). Finalmente, todos os 3 produtos: têm apis do cliente para as linguagens mais comuns (C, Java. Net, Python, Php, Ruby,) têm forte documentação são ativamente suportados 08 de novembro de 09 às 13:46 Nawaz 207k 9679 65 9679 459 9679 666 Embora seja verdade, não tenho certeza se a adoção de AMQP tem forte correlação com a pergunta original. Eu acho que há considerações mais importantes para a escolha de uma fila de mensagens do que o protocolo de fio subjacente que ele usa. Ndash StaxMan May 13 10 at 22:26 A pergunta não menciona exigindo AMQP, mas esta resposta está focada em AMQP. Se nós assumíssemos o JMS como um requisito, então a resposta seria basicamente o inverso: o ActiveMQ é mais popular, o RabbitMQ tem algum suporte que provavelmente deveria funcionar. Se nenhum protocolo de fio assumido: ver outras respostas. Ndash Fletch Dec 2 10 at 10:53 Tendo trabalhado em RabbitMQ e ActiveMQ eu recomendaria você ficar longe do ActiveMQ. Os lançamentos são muito buggy, e eu não tinha fim de problemas com máquinas indo para baixo e vazamentos de memória etc RabbitMQ, por outro lado apenas funciona. Depois que eu liguei em I39ve NUNCA tinha que olhar para ele novamente. Ele apenas faz o que precisa. Se você gosta Eu tenho um simples tutorial RabbitMQ no meu blog Servidor de fila de mensagens Servidores de fila de mensagens estão disponíveis em vários idiomas, Erlang (RabbitMQ), C (beanstalkd), C Ruby (Starling ou Sparrow), Scala (Kestrel, Kafka) ou Java (ActiveMQ). Uma breve visão geral pode ser encontrada aqui escrito por Alex MacCaw Sparrow é uma fila leve escrito em Ruby que fala memcache escrito por Blaine Cook no Twitter Starling é um Message Queue Server baseado no MemCached escrito em Ruby armazena trabalhos na memória (fila de mensagens) documentação: Alguns bons tutoriais, por exemplo o railscast sobre starling e workling ou esta postagem no blog sobre starling escrito por Robey Pointer Starling clone escrito em Scala (um porto de Starling de Ruby para Scala) As filas são armazenadas na memória, mas conectado no disco RabbitMQ é um Message Queue Server em Erlang armazena trabalhos na memória (fila de mensagens) ActiveMQ é um corretor de mensagens de código aberto em Java escrito por Philotic, Inc. para melhorar o tempo de resposta de um aplicativo Facebook em memória de serviço de workqueue escrito em C Docu: nubyonrails / Escrito no LinkedIn em Scala Usado pelo LinkedIn para descarregar o processamento de todas as páginas e outras visualizações Padrões para usar persistência, usa cache de disco do SO para dados quentes (tem maior taxa de transferência do que qualquer um dos Acima com persistência ativada) Suporta tanto on-line como processamento off-line A biblioteca de soquete que atua como uma estrutura de simultaneidade Mais rápido do que TCP, para produtos em cluster e supercomputação Carrega mensagens em inproc, IPC, TCP e multicast Conectar N-a-N Via fanout, pubsub, pipeline, E / S Asynch de resposta de solicitação para aplicativos de passagem multicore de mensagens escalonáveis ​​O EagleMQ é um gerenciador de filas open source, de alto desempenho e leve. Escrito em C Armazena todos os dados na memória e suporta persistência. Ele tem seu próprio protocolo. Suporta trabalho com filas, rotas e canais. IronMQ Escrito em Go Serviço de fila totalmente gerenciado Disponível tanto como versão em nuvem quanto on-site Espero que isso seja útil para nós. Fonte Michael - quero elaborar um pouco mais O problema é a entrega em tempo real em um sistema de bate-papo em grupo. Se eu entender corretamente, você está falando sobre um mecanismo de armazenamento durável para as mensagens como um ponto final (caixa de entrada) Se assim for, então ele não se encaixa a conta, eles querem chat para ser entregue imediatamente e os clientes a ser assinantes diretos Até onde eu posso dizer Ter uma tonelada de tópico baseado em filas não é um caso de uso otimizado ndash Josh Oct 16 10 at 20:38 Isso realmente depende do seu caso de uso. Comparando 0MQ com ActiveMQ ou RabbitMQ não é justo. ActiveMQ e RabbitMQ são Sistemas de Mensagens que requerem instalação e administração. Eles oferecem featurewise muito mais do que ZeroMQ. Eles têm verdadeiras filas persistentes, Suporte para transações, etc ZeroMQ é uma leve mensagem orientada implementação socket. Também é adequado para programação assíncrona durante o processo. É possível executar um Enterprise Messaging System sobre o ZeroMQ, mas você teria que implementar muito por conta própria. ActiveMQ, RabbitMQ, Websphere MQ e MSMQ são filas de mensagens corporativas O ZeroMQ é uma biblioteca orientada a mensagens IPC. Theres uma comparação entre RabbitMQ e ActiveMQ aqui. Fora da caixa, ActiveMQ está configurado para garantir a entrega de mensagens - o que pode dar a impressão de sua lenta em comparação com sistemas de mensagens menos confiáveis. Você pode sempre alterar a configuração para o desempenho se desejar e obter pelo menos o desempenho tão bom quanto qualquer outro sistema de mensagens. Pelo menos você tem essa opção. Theres um monte de informações sobre os fóruns e FAQ do ActiveMQ para configuração de dimensionamento, desempenho e alta disponibilidade. Além disso, o ActiveMQ suporta AMQP 1.0 quando a especificação for finalizada, juntamente com outros formatos de fios, como o STOMP. Outra vantagem para o ActiveMQ é seu projeto Apache, então há diversidade na comunidade de desenvolvedores - e não está vinculado a uma empresa. Eu não usei o ActiveMQ ou RabbitMQ mas usei o ZeroMQ. A grande diferença que eu vejo entre ZeroMQ e ActiveMQ etc é que 0MQ é corretora e não tem construído em confiabilidade para a entrega de mensagens. Se você está procurando um fácil de usar a API de mensagens suportando muitos padrões de mensagens, transportes, plataformas e ligações de idioma, em seguida, 0MQ é definitivamente vale a pena olhar. Se você estiver procurando por uma completa soprado mensagem plataforma, em seguida, 0MQ pode não caber a factura. Consulte zeromq. org/docs:cookbook para obter muitos exemplos de como o 0MQ pode ser usado. Eu com êxito usando 0MQ para a passagem de mensagens em uma aplicação de monitoramento de uso de eletricidade (0) usando zeroMQ . Eu queria uma mensagem simples passando sistema e eu não preciso da complicação de um corretor. Eu também não quero um enorme sistema empresarial orientado a Java. Se você quiser um sistema rápido e simples e você precisa de suporte a vários idiomas (eu uso C e. net), então eu recomendo olhar 0MQ. Respondeu Jul 28 10 at 16:18 Também usando ZMQ em C / C ambiente. Muito rápido. Usando o padrão do corretor. Um bom ajuste para o nosso aplicativo VOIP watch-dog em tempo real fazendo micro-pmts para fazendas de servidores kamailio SIP. Com certeza eu poderia escrever um corretor muito sofisticado usando ZMQ, mas iria avaliar alguns produtos adicionais antes de cometer a isso. Ndash RocketRoy Nov 7 13 at 6:26 Eu só posso adicionar meus 2 centavos sobre ActiveMQ, mas desde que este é um dos mais populares: O idioma que você deseja escrever pode ser importante. Embora o ActiveMQ tenha um cliente para a maioria, sua implementação C está longe de ser completa em comparação com a Biblioteca Java. Isso significa que algumas funcionalidades básicas são flaky (fail-over protocolo que bem .. falha em alguns casos, sem suporte de redelivery) e outros simplesmente isnt lá. Uma vez que o. net não parece ser tudo o que é importante para o projeto, o desenvolvimento é bastante lento e não há parece ser qualquer plano de lançamento. Tronco é muitas vezes quebrado, então se você considerar isso, você pode querer considerar a contribuir para o projeto, se você quer que as coisas vão em frente. Depois, há ActiveMQ em si que tem um monte de características agradáveis, mas algumas questões muito estranhas também. Nós usamos a versão Fuse (Progress) do activemq por razões de estabilidade, mas mesmo assim há alguns bugs estranhos que você quer manter em mente: Corretores que param de enviar mensagens em algumas ocasiões Jornal Erros fazendo a fila mostram mensagens que não estão lá (Eles não são entregues ao consumidor, mas ainda) A prioridade ainda não está implementado (está na lista de problemas desde o início do tipo humano) etc etc Todos e todos, é um bom produto se você pode viver com a sua Problemas: A) não têm medo de se envolver ativamente ao usar. NET B) desenvolver em java -) respondido Oct 29 09 em 9:47 Minor Update: Desde há algum tempo, KahaDB é o armazenamento de persistência padrão para ActiveMQ. No entanto: não é estável em tudo. Em nossos testes, vimos corrupções de bancos de dados (alguns restauráveis, outros nos custando cerca de 15.000.000 mensagens) CUIDADO COM ESTE Ndash Noctris Apr 4 11 at 8:25 ZeroMQ é realmente com zero filas É realmente um erro Não tem hav filas , Tópicos, persistência, nada É apenas um middleware para sockets API. Se é o que você está procurando cool caso contrário, esqueça que não é como activeMQ ou rabbitmq. Há uma comparação das características e desempenho de RabbitMQ ActiveMQ e QPID dado em bhavin. directi / rabbitmq-vs-apache-activemq-vs-apache-qpid / Pessoalmente, eu tentei todos os três acima. RabbitMQ é o melhor desempenho sábio de acordo comigo, mas não tem opções de failover e recuperação. O ActiveMQ tem mais recursos, mas é mais lento. Atualizar. HornetQ também é uma opção que você pode olhar, é queixa JMS, uma opção melhor do que ActiveMQ se você estiver procurando por uma solução baseada em JMS. Respondeu Aug 23 10 at 11:05 Eu escrevi sobre a minha experiência inicial sobre AMQP, Qpid e ZeroMQ aqui: ron. shoutboot / 2010/09/25 / is-ampq-for-you / Minha opinião subjetiva é que AMQP é bom se você Realmente precisa das instalações de mensagens persistentes e não está muito preocupado que o corretor pode ser um gargalo. Além disso, cliente C está atualmente ausente para AMQP (Qpid didnt ganhar o meu apoio não tenho certeza sobre o cliente ActiveMQ no entanto), mas talvez trabalho em andamento. ZeroMQ pode ser o caminho contrário. Eu usei o ActiveMQ em um ambiente de produção há cerca de 3 anos. Enquanto ele começa o trabalho feito, alinhando versões das bibliotecas cliente que funcionam corretamente e são bug livre pode ser um problema. Estávamos olhando para a transição para RabbitMQ. Respondeu May 14 11 at 18:12 Há alguma discussão nos comentários desta postagem no blog. Sobre o Twitter escrevendo sua própria fila de mensagens, o que pode ser interessante. Steve fez extensa carga e testes de estresse de ActiveMQ, RabbitMQ, etc ActiveMQ é realmente muito lento (muito mais lento do que Kestrel), RabbitMQ constantemente bate com muitos produtores e muito poucos consumidores. Você provavelmente não terá Twitter-como a carga inicialmente no entanto :) respondeu Apr 8 09 at 20:33 Poucas aplicações têm tantas configurações de ajuste como ActiveMQ. Alguns recursos que destacam o ActiveMQ são: Tamanho Prefetch configurável. Rosca configurável. Failover configurável. Notificação administrativa configurável aos produtores. Detalhes em: respondeu Jul 20 10 at 19:17 Abie, tudo se resume a seu caso de uso. Ao invés de confiar em alguém elses conta de seu caso de uso, sinta-se livre para postar seu caso de uso para a lista rabbitmq-discuss. Pedir no twitter você receberá algumas respostas também. Best wishes, alexis respondeu May 18 09 at 13:07 Sobre ZeroMQ aka 0MQ, como você já deve saber, é o que você vai obter mais mensagens por segundo (eles foram cerca de 4 milhões por segundo em seu servidor ref última vez que eu Verificado), mas como você também pode já saber, a documentação é inexistente. Você terá um tempo difícil encontrar como iniciar o servidor (s), muito menos como usá-los. Eu acho que é parcialmente porque ninguém contribuiu sobre 0MQ ainda. Respondeu May 15 10 at 3:06 Existem exemplos no livro de receitas zeromq. org/docs:cookbook e há um manual api. zeromq. org/zmq. html. Ndash Nick Jul 28 10 às 16:13 enquanto zmq é rápido e tem uma api fácil, tenha em mente isso: sem persistência, sem transações. Nenhuma detecção de consumidores falidos ou lentos (as mensagens simplesmente são descartadas sem qualquer notificação ao programa produtor). Sidenote: zmq é serverless, então você won39t encontrar docs para iniciar os servidores. Eles têm um servidor proxy se tiver necessidade de algo como que embora. Ndash nos Jul 28 10 at 16:33 Se você também está interessado em implementações comerciais, você deve dar uma olhada no Nirvana de meus canais. Nirvana é usado pesadamente dentro da indústria de serviços financeiros para plataformas de grande escala de baixa latência de negociação e de distribuição de preços. Há suporte para uma ampla gama de linguagens de programação de clientes em todos os domínios da empresa, web e móvel. Os recursos de cluster são extremamente avançados e vale a pena olhar se HA transparente ou balanceamento de carga é importante para você. Todas as opções, com exceção de ZMQSUBSCRIBE, ZMQUNSUBSCRIBE, ZMQLINGER, ZMQROUTERMANDATORY e ZMQXPUBVERBOSE só têm efeito para o subseqüente ligação de soquete / Se conecta. Descrição A função zmqsetsockopt () deve definir a opção especificada pelo argumento optionname para o valor apontado pelo argumento optionvalue para o soquete MQ apontado pelo argumento socket. O argumento optionlen é o tamanho do valor da opção em bytes. As seguintes opções de soquete podem ser definidas com a função zmqsetsockopt (): ZMQSNDHWM: Definir marca de margem alta para mensagens de saída A opção ZMQSNDHWM deve definir a marca de margem alta para mensagens de saída no soquete especificado. A marca de margem alta é um limite rígido no número máximo de mensagens pendentes MQ deve fila na memória para qualquer ponto único que o socket especificado está se comunicando com. Se este limite for atingido, o soquete entrará em um estado excepcional e, dependendo do tipo de soquete, o MQ tomará as medidas apropriadas, como bloquear ou descartar as mensagens enviadas. Consulte as descrições de soquetes individuais em zmqsocket (3) para obter detalhes sobre a ação exata tomada para cada tipo de soquete. MQ não garante que o soquete aceitará tanto como ZMQSNDHWM mensagens, eo limite real pode ser tanto quanto 60-70 inferior dependendo do fluxo de mensagens no soquete. Tipo de valor de opçãoEm dados de cópia de rede de alto desempenho são considerados prejudiciais ao desempenho e evitados tanto quanto possível. A técnica de evitar todas as cópias é conhecida como quotzero-copyquot. Este artigo demonstra o impacto de cópia única dos dados sobre latência. Mostra, por exemplo, que para 256MB de dados, uma única cópia pode aumentar a latência por 0,1 segundo Obviamente, os dados são copiados da memória para a placa de interface de rede e vice-versa, eles são copiados no espaço do usuário / kernel espaço limite etc. Linux Journal dá explicação detalhada do que está acontecendo sob o capô do sistema operacional e quais são as maneiras de chegar o mais próximo possível do zero-copy. No entanto, neste blog vamos discutir apenas uma única instância de copiar os dados, ou seja, copiar dados do usuário em mensagens MQ. Considere o seguinte exemplo. Bem criar uma mensagem de milhões de bytes de comprimento e copiar os dados do usuário nele antes de enviar: A parte memcpy parece suspeito. Temos os dados no buffer já, então por que não enviar o buffer em si, em vez de copiá-lo para a mensagem É MQ capaz de tal coisa Na verdade, sim. É e sempre foi. Tudo o que temos a fazer é definir a função de desalocação para o buffer e passá-lo para MQ juntamente com o buffer: Uma vez que a função deallocation é definida, podemos criar uma mensagem quotzero-copyquot e passá-lo a função buffer e deallocation: É agora propriedade da mensagem. Será desalocado uma vez que a mensagem é enviada. Não devemos desalocar o buffer nós mesmos. Observe também o parâmetro dica. Pode ser utilizado se for utilizado um mecanismo de alocação mais complexo. Digamos que alocamos o pedaço usando algum objeto quotallocatorquot e temos que desalocá-lo através do mesmo objeto. Em tal caso, podemos passar o ponteiro para alocador como uma dica para zmqmsginitdata e modificar a função deallocation da seguinte forma: Weve se livrou da cópia, certo Bem, não inteiramente. Em alguns casos, o acima pode funcionar. Em outros casos, é insuficiente. Considere o caso quando temos duas matrizes grandes 8212 cada 100MB de comprimento 8212 que queremos transferir. Infelizmente, eles não são contíguos na memória. Cada um foi alocado usando a invocação malloc separada e, portanto, não podemos descrever ambos usando um único ponteiro de dados. Por que não enviá-los como duas mensagens separadas, em seguida, considere dizer REQ soquete. Ele carrega mensagens de saldos. Em outras palavras, se houver dois soquetes REP conectados a ele, o envio de duas mensagens resultaria na primeira matriz sendo despachada para um soquete REP enquanto a segunda para o outro soquete REP. Não é isso que queremos. Queremos que as duas matrizes formem uma unidade atômica de transferência. Eles nunca devem ser separados. Parece que, neste caso, precisamos de algo equivalente ao POSIX reunir arrays. Para aqueles que não estão familiarizados com a API de soquete Berkeley, a matriz de agrupamento é uma matriz de pedaços de dados enviados para a pilha de rede usando uma única chamada. Mas que conta para todos os cenários possíveis Theres ainda um cenário onde ele não vai ajudar. Ou seja, quando as duas matrizes não existem ao mesmo tempo. Primeiro um é criado, enviado e desalocados, em seguida, um segundo. Em tal caso, a matriz de recolha seria inútil. Theres nenhum ponto único no tempo quando possuímos todos os dados e, portanto, são capazes de preencher a matriz de recolha. O novo recurso no MQ chamado quotmulti-part messagequot resolve o problema. Para colocá-lo simplesmente, ele permite que você concatenar várias mensagens em uma única mensagem: Parece quase exatamente como se você estivesse enviando duas mensagens separadas, exceto para passar ZMQSNDMORE flag para o primeiro enviar. O ponto importante a ser observado é que, embora todas as partes da mensagem sejam tratadas como uma única unidade atômica de transferência, os limites entre as partes da mensagem são estritamente preservados. Em outras palavras, se você enviar uma mensagem consistindo em duas partes de mensagem, cada 100 bytes de comprimento, no outro lado você nunca receberá uma única parte de mensagem 200 bytes de comprimento. Ou duas partes de mensagem, 50 e 150 bytes de comprimento. Ou mesmo quatro partes de mensagem, cada 50 bytes de comprimento. Youll obter exatamente o que você enviou 8212 duas partes de mensagem, cada 100 bytes de comprimento na mesma ordem como eles foram enviados. Esse fato permite o uso de mensagens de várias partes para adicionar estrutura de grãos grosseiros à sua mensagem. O exemplo com duas matrizes ilustra o ponto. Você envia as duas matrizes como duas partes de mensagem e assim evitar a cópia. No entanto, ao mesmo tempo, as matrizes são limpa separadas, cada um residindo em sua própria mensagem parte e você está garantido que a separação será preservada mesmo no lado do recebimento. Conseqüentemente você não tem que põr o tamanho da matriz na mensagem ou inventar qualquer tipo de delimitadores do quotmatrix. Outro uso interessante de mensagens de várias partes é combiná-las com soquetes PUB / SUB. O padrão de mensagens de publicação / subscrição permite subscrever um subconjunto específico de mensagens. A assinatura é um pedaço de dados fornecidos pelo receptor, dizendo quotplease, envie-me todas as mensagens começando com estes dataquot: Obviamente, o remetente tem de colocar os dados apropriados no início da mensagem para torná-lo entregue ao assinante específico: A parte de A mensagem que é verificada em relação às assinaturas é chamada de tópico. No nosso caso o tópico é quotABCquot. Quando o tópico é de comprimento variável você precisa de um delimitador para separar é do resto da mensagem, de modo que mecanismo de assinatura doesnt incidentalmente considerar início dos dados para ser uma continuação do tópico. O exemplo a seguir usa o símbolo quotpipequot como delimitador: Enquanto isso funciona, é um pouco feio. Ainda mais importante, se o tópico acontecer de ser dados binários, theres nenhum símbolo sobressalente que podemos usar como o delimitador. Solução elegante é usar uma mensagem de duas partes. As subscrições são sempre avaliadas apenas contra a primeira parte da mensagem, para que possamos colocar o tópico na primeira parte da mensagem enquanto o resto dos dados na segunda (ou mesmo em várias partes da mensagem subseqüente): Uma observação final. Ao receber uma mensagem, você pode saber que cada mensagem consiste de duas partes, digamos quottopicquot e quotvaluequot. No entanto, em outros cenários, talvez você não tenha idéia de quantas partes de mensagem há na mensagem. Nesse caso, o MQ permite que você pergunte ao soquete se há mais partes de mensagem a serem recebidas ou não. Isto é feito usando a opção de soquete ZMQRCVMORE: Escrito: 08 de Maio de 2010 09:58 Revisado: 01 Ago 2012 10:33 Se você encontrou esta página útil, por favor avalie-a para que outros possam encontrá-lo.

No comments:

Post a Comment