Pergunta

difícil olhar isso se tiver sido solicitado anteriormente desde que eu não sei o nome para ele. Então aqui vai:

Eu estou fazendo este servidor que se conecta a gateways de mensagens para enviar msgs. Uma sessão com este gateway requer uma combinação de nome de usuário / senha. Desta forma, o gateway sabe quem a conta.

Agora, eu poderia ter milhares de mensagens na fila de envio, pertencente por exemplo, para 5 combos nome de usuário / senha diferentes. No entanto, a porta de entrada é restrita que eu só tenho dizer 2 conexões abertas ao mesmo tempo.

Então, efetivamente, é uma questão de oferta e demanda com restrições:

I tem uma porta de entrada, que só pode lidar com N ligações simultâneas (nome de utilizador / PW combinação) Tenho X mensagens empilhados pertencente a Y diferente de estas ligações

como faço para, em um agradável e limpo forma, gerir de forma eficiente essas conexões para que eles, por vezes, dar espaço para respirar para outras ligações, talvez até mesmo levar em conta a prioridade, talvez até mesmo permitir que múltiplas conexões com o mesmo nome de usuário / senha para velocidade extra (se não sentar-se no caminho de outras conexões em fila)

Alguém tem uma pista que tipo de algoritmos existem para isso? Então eu posso google para ele. Ou talvez alguém já pode me dar algumas dicas.

Eu dei algumas facadas nele mesmo, mas eu sinto que estou ainda não ainda a criação de uma solução elegante, mas de alguma forma endup no longo aninhados if

graças

Foi útil?

Solução

Como outra com dossel mencionados, você precisa de uma prioridade da fila, embora eu sugiro que você cruzar a fila de prioridade com uma fila-de-filas.

  1. Para cada conexão (nome de usuário / senha), criar uma fila LIFO simples. O módulo que recebe mensagens devem enfileirar-los para o usuário apropriado.
  2. O módulo despachante deve manter uma classificadas com prioridade fila-de-filas. Isto implica que você tem um priority(queue) função que calcula a prioridade para uma determinada fila com base no número de mensagens, a prioridade conta, o tempo desde o último envio, etc. Implementação priority(queue) é deixado como um exercício para o leitor.
  3. loop interno do despachante leva os N filas de maior prioridade fora das filas fila de-, faz uma conexão com o gateway para cada nome de usuário / senha e envia todas as mensagens nessas filas. As filas recém-esvaziados voltar para as filas fila de-. prioridade Recalcular para todas as filas, enxaguar e repetir.

O ideal é que a parte de envio de mensagem da etapa # 3 poderia ser multi-threaded.

Uma implementação alternativa da etapa # 3 seria para enviar mensagens de cada fila até prioridade que fila cai abaixo a prioridade da próxima fila de espera. No entanto, isso implica que você recalcular priority(queue) depois de cada envio, que pode ser mais caro do que vale a pena.

Outras dicas

Conceitualmente você deseja implementar um Priority Queue .

Uma vez que você tem idéias específicas sobre que mensagem de priorizar sobre os outros, você iria querer uma implementação que permite calcular uma pontuação de prioridade para cada entrada de fila. Desde que você quer agrupar mensagens às vezes, você também precisa ser capaz de examinar a fila ao atribuir prioridade a uma nova entrada de fila (por exemplo, você pode optar por definir a prioridade de um novo elemento igual à prioridade do mais recente existente elemento com o mesmo nome de usuário, desde que não mais do que N elementos já tem essa prioridade.

Uma vez que você tem um número fixo de gateways de saída, você provavelmente quer um fila de prioridade por gateway. A componente de roteamento que leva uma nova mensagem e determina qual fila para colocá-lo no poder examinar elementos em cada fila existente para determinar qual deles melhor lugar lo em (lugar ou seja, na mesma fila como outros elementos com o mesmo ID de usuário) se que irá otimizar o rendimento.

Se o seu gateway é até um pouco mais lento que o algoritmo de roteamento, você terá um aumento líquido na velocidade, tornando o algoritmo de roteamento tão inteligente quanto possível.

Dê uma olhada OS agendamento de tarefas e agendamento de rede algoritmos. Eles tentam resolver um monte de problemas semelhantes de atribuir timeslices de um recurso limitado a um maior número de consumidores. Há uma enorme quantidade de pesquisa lá fora. Em particular enfileiramento justo ponderado soa como ele pode ser útil para você.

Qualquer escolhas particulares dependem fortemente o comportamento que você quer que seu algoritmo de ter. Por exemplo, se você quiser minimizar a latência para todas as filas que você vai querer priorizar filas com as mensagens mais antigas e talvez dar fatias maiores para as filas mais longas.

Por outro lado, você pode querer preempt alguém fazendo grande lote envia como suas mensagens terão uma longa latência de qualquer maneira e deixe filas com o uso de luz através de antes do envio em lote.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top