AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / dba / Perguntas / 18355
Accepted
fa1c0n3r
fa1c0n3r
Asked: 2012-05-25 01:54:24 +0800 CST2012-05-25 01:54:24 +0800 CST 2012-05-25 01:54:24 +0800 CST

Como você implementaria grupos de conversação/bloqueio para vários usuários de uma Fila do Service Broker?

  • 772

Como você implementa grupos de conversação para vários usuários usando sua própria instância dos aplicativos de usuário, mas enviando mensagens relacionadas à fila do agente de serviços? Algum bom exemplo desse tipo de implementação? Eu tinha imaginado que eu mesmo poderia definir o ID do grupo de conversação, garantindo que certos grupos de mensagens de vários usuários sejam relacionados, mas parece que esse valor vai ser gerado automaticamente como um UNIQUEIDENTIFIERS... Será que essa é mesmo a melhor maneira fazer isso?

Eu gostaria de ter certeza de capturar e bloquear mensagens relacionadas onde dois usuários "no mesmo time", por exemplo, estão fazendo lances no mesmo item juntos, para que a lógica do aplicativo do servidor possa processar adequadamente essas mensagens relacionadas juntas (basicamente apenas a primeira será aceito e o segundo será rejeitado até que a visualização do usuário possa ser atualizada para que ele saiba que o outro usuário já alterou o lance).

a direção do fluxo é dos usuários A, B, C enviando mensagens xml para a fila e, em seguida, um serviço de desenfileiramento que envia o xml para um serviço da Web externo. As mensagens que estamos enviando são mensagens xml estruturadas que modificarão pedidos em diferentes itens no serviço da Web externo após o desenfileiramento.

Obrigada!

sql-server sql-server-2008
  • 1 1 respostas
  • 2148 Views

1 respostas

  • Voted
  1. Best Answer
    Remus Rusanu
    2012-05-25T04:08:00+08:002012-05-25T04:08:00+08:00

    Você não pode usar grupos de conversação para excluir instâncias de aplicativos, se é isso que está tentando fazer. Se a instância A precisar receber mensagens da fila apenas para a instância A e a instância B precisar receber mensagens apenas para a instância B, a instância A precisará usar a fila A e a instância B precisará usar a fila B . O grupo de conversação pode ser usado somente quando a instância A e a instância B podem processar quaisquer mensagens, mas você deseja excluí-las do processamento simultâneo de mensagens correlacionadas . Toda vez que vi alguém tentando pré-gerar IDs de grupos de conversação, a ideia sempre foi ruim.

    Atualizar

    O iniciador não pode controlar o grupo de conversação do destino (target). Mesmo que A e B estivessem no mesmo grupo de conversação no site iniciador, isso não significa que eles seriam os mesmos no site de destino, pois o grupo de conversação é um conceito local e não viaja com a mensagem. Se você deseja que as mensagens enviadas por A e B pertençam ao mesmo grupo de conversação no lado de destino, o diálogo deve ser iniciado na ordem 'inversa': o destino inicia o(s) diálogo(s) e os coloca em um único grupo de conversação, então o(s) alvo(s) começa(m) a enviar mensagens neste(s) diálogo(s). Assim, as conversas funcionam como um 'convite' para enviar mensagens, o 'alvo' lógico age como o 'iniciador' real.

    Atualização nº 2.

    é assim que funcionaria, em teoria: digamos que você tenha 10.000 produtos. Para fazer o padrão 'reverso', quando um usuário deseja participar do aplicativo, ele precisa 'participar'. Então, ele inicia uma conversa com o servidor e envia uma mensagem 'Quero participar' (ele chama isso de 'conversa 0 '). O servidor processa esta mensagem iniciando uma conversa com este novo usuário para cada produto. Agora o usuário tem 10.000 conversas nas quais pode enviar 'lances'. Para o produto A, ele usa a conversa 1, para o produto B, a conversa 2, etc. Quando o usuário B deseja entrar, ele também inicia uma nova conversa com o servidor e envia uma mensagem 'Quero entrar'. O servidor responde iniciando 10.000 conversas com esse novo usuário, novamente uma para cada produto, e garante que cada um esteja no grupo correspondente ao produto, de modo que a conversa do produto A com o usuário 1 esteja no mesmo grupo da conversa do produto a para o usuário 2.

    Agora, obviamente, qualquer um descobrirá que esse esquema é falho: requer number_of_products X number_of_user chats, torna a adição e remoção de produtos uma dor de cabeça (deve manter todas essas conversas do usuário!) E assim por diante. Uma alternativa é multiplexar produtos por conversa. Digamos que o servidor inicie apenas 10 conversas com cada usuário e o usuário use a conversa correspondente ao último dígito do ID do produto (portanto, o produto 1 vai para a conversa 1, mas o produto 11 ou 101 também). Isso é mais viável, requer muito menos conversas e não requer gerenciamento especial de conversas quando produtos são adicionados ou removidos. Você pode considerar que é uma desvantagem que agora o servidor bloqueia não todas as mensagens do produto 1, mas também todas as mensagens do produto 11, todas do 101 etc, mas considere o seguinte: só importa se você tivermais threads de processamento no servidor do que o número de conversas por usuário . Se você tiver 5 threads, não importa se você bloqueou 1, 11, 101, ainda há mensagens para processar para os outros 4 threads. Só importaria se você tivesse 11 threads, já que o 11º thread não tem nada para processar.

    Agora não estou defendendo a implantação exatamente disso, estou apenas apontando algumas possibilidades. Na maioria dos casos, o bloqueio de CG seria por usuário, não por produto, e adicionar essa dimensão extra de usar o bloqueio de CG para evitar problemas de simultaneidade em cada produto é um pouco heterodoxo.

    E não esqueça que a única construção que garante a ordem no SSB é uma conversa. Portanto, se os usuários precisarem enviar lances para A na conversa 1, seguidos de lances para B na conversa 2, não há garantia de que o lance para A será processado depois que o lance para B for processado. A única garantia é que se o usuário 1 enviar dois lances para A, eles serão processados ​​na ordem enviada.

    Além disso, se dois usuários diferentes enviarem lances para o produto A, não há garantia da ordem de processamento desses lances. No entanto, se os lances do produto A terminarem no mesmo CG, existe a garantia de que apenas um 'processador thread' verá o lance do usuário 1 e o lance do usuário 2, mas tenha cuidado porque não há garantia de que os lances são apresentados no conjunto de resultados RECEIVE na ordem em que foram recebidos. A RECEIVE apenas garante que:

    • todas as mensagens no conjunto de resultados são do mesmo CG
    • as mensagens pertencentes a uma conversa estão em ordem

    mas a ordem das conversas no resultado é basicamente aleatória (é orientada pela ordem do identificador de conversa, um GUID).

    Antes que eu me esqueça: lembre-se de que também existe, MOVE CONVERSATIONmas confiar no MOVE (em vez de iniciar conversas diretamente no CG correto) é muito, muito propenso a impasses.

    • 2

relate perguntas

  • Quais são as principais causas de deadlocks e podem ser evitadas?

  • Quanto "Padding" coloco em meus índices?

  • Existe um processo do tipo "práticas recomendadas" para os desenvolvedores seguirem para alterações no banco de dados?

  • Como determinar se um Índice é necessário ou necessário

  • Downgrade do SQL Server 2008 para 2005

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Como ver a lista de bancos de dados no Oracle?

    • 8 respostas
  • Marko Smith

    Quão grande deve ser o mysql innodb_buffer_pool_size?

    • 4 respostas
  • Marko Smith

    Listar todas as colunas de uma tabela especificada

    • 5 respostas
  • Marko Smith

    restaurar a tabela do arquivo .frm e .ibd?

    • 10 respostas
  • Marko Smith

    Como usar o sqlplus para se conectar a um banco de dados Oracle localizado em outro host sem modificar meu próprio tnsnames.ora

    • 4 respostas
  • Marko Smith

    Como você mysqldump tabela (s) específica (s)?

    • 4 respostas
  • Marko Smith

    Como selecionar a primeira linha de cada grupo?

    • 6 respostas
  • Marko Smith

    Listar os privilégios do banco de dados usando o psql

    • 10 respostas
  • Marko Smith

    Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Como faço para listar todos os bancos de dados e tabelas usando o psql?

    • 7 respostas
  • Martin Hope
    Mike Walsh Por que o log de transações continua crescendo ou fica sem espaço? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland Listar todas as colunas de uma tabela especificada 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney O MySQL pode realizar consultas razoavelmente em bilhões de linhas? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx Como posso monitorar o andamento de uma importação de um arquivo .sql grande? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison Como você mysqldump tabela (s) específica (s)? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    pedrosanta Listar os privilégios do banco de dados usando o psql 2011-08-04 11:01:21 +0800 CST
  • Martin Hope
    Jonas Como posso cronometrar consultas SQL usando psql? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas Como faço para listar todos os bancos de dados e tabelas usando o psql? 2011-02-18 00:45:49 +0800 CST
  • Martin Hope
    bernd_k Quando devo usar uma restrição exclusiva em vez de um índice exclusivo? 2011-01-05 02:32:27 +0800 CST

Hot tag

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve