Aplicativos em tempo real de alto tráfego são amplamente utilizados no ambiente corporativo. Em aplicações em tempo real, as informações são disponibilizadas para você no momento em que são produzidas e qualquer atraso na entrega pode causar sérios prejuízos financeiros. O principal desafio enfrentado por esses aplicativos em tempo real de alto tráfego é ser notificado sobre qualquer alteração no conjunto de dados para que as visualizações correspondentes possam ser atualizadas.
Porém, essas aplicações em tempo real de alto tráfego não podem depender do banco de dados tradicional porque suportam apenas consultas nos dados residentes e para obter o conjunto de dados atualizado é necessário executar novamente a consulta após um intervalo específico que não é instantâneo. E essa sondagem periódica também causa problemas de desempenho e escalabilidade porque você está fazendo viagens caras ao banco de dados principalmente mesmo quando não há alterações no conjunto de dados.
SqlDependência é fornecido pela Microsoft no SQL Server, e o Oracle no Windows também o suporta. SqlDependency permite que você especifique uma instrução SQL e o SQL Server monitora esse conjunto de dados no banco de dados para quaisquer adições, atualizações ou exclusões e notifica quando isso acontece. Mas o problema com SqlDependency é que, uma vez disparado, ele é desregistrado no banco de dados. Portanto, todas as alterações futuras em seu conjunto de dados são perdidas e você não é notificado.
Além disso, SqlDependency não fornece detalhes do registro onde ocorreu a alteração. Portanto, para encontrar a alteração no conjunto de dados, você precisa buscar o conjunto de dados completo novamente, em vez de buscar diretamente apenas o registro específico, que é adicionado, atualizado ou removido do conjunto de dados. E, claro, isso não é eficiente.
Além das limitações do SqlDependency, seu banco de dados também não é capaz de lidar com as demandas transacionais desses aplicativos de alto tráfego em tempo real, onde dezenas de milhares de consultas são executadas a cada segundo e o banco de dados rapidamente se torna um gargalo de escalabilidade. Isso ocorre porque, embora você possa dimensionar linearmente sua camada de aplicativo adicionando mais servidores de aplicativos, não é possível fazer o mesmo com seu servidor de banco de dados.
É aqui que um cache distribuído como NCache vem porque permite que você armazene dados em cache e reduza aquelas viagens caras ao banco de dados que estão causando gargalos de escalabilidade.
NCache tem um poderoso recurso de Consulta Contínua que permite registrar uma consulta do tipo SQL com o cluster de cache. Esta Consulta Contínua permanece ativa no cluster de cache e se houver alguma alteração no conjunto de dados desta consulta, então NCache notifica seu aplicativo em tempo real. Essa abordagem de consulta contínua evita que você execute periodicamente a mesma consulta cara no banco de dados para pesquisar.
Aqui está o código de exemplo para NCache Consulta Contínua:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 |
public void Main(string[] args) { … NCache.InitializeCache("myPartitionReplicaCache"); String query = "SELECT NCacheQuerySample.Business.Product WHERE this.ProductID > 100"; Hashtable values = new Hashtable(); values.Add("ProductID", 100); … onItemAdded = new ContinuousQueryItemAddedCallback(OnQueryItemAdded); onItemUpdated = new ContinuousQueryItemUpdatedCallback(OnQueryItemUpdated); onItemRemoved = new ContinuousQueryItemRemovedCallback(OnQueryItemRemoved); ContinuousQuery query = new ContinuousQuery(queryString, values); query.RegisterAddNotification(onItemAdded); query.RegisterUpdateNotification(onItemUpdated); query.RegisterRemoveNotification(onItemRemoved); _cache.RegisterCQ(query); … } //data set item is removed void OnQueryItemRemoved(string key){ … Console.WriteLine("Removed key: {0}", key); … } //data set item is updated void OnQueryItemUpdated(string key){ … Console.WriteLine("Updated key: {0}", key); … } //data set item is removed void OnQueryItemAdded(string key){ … Console.WriteLine("Added key: {0}", key); … } |
E, ao contrário do SqlDependency, NCache A Consulta Contínua permanece ativa e não é cancelada em cada notificação de alteração. Assim, seus aplicativos em tempo real de alto tráfego continuam a ser notificados em várias alterações.
NCache A Consulta Contínua também oferece a flexibilidade de ser notificado separadamente em ADD, UPDATE e DELETE. E você pode especificar esses eventos em tempo de execução mesmo após criar uma Consulta Contínua, algo que SqlDependency não permite que você faça. Isso também reduz o tráfego de eventos do cluster de cache para seu aplicativo em tempo real.
Em suma, NCache fornece-lhe um muito poderoso Consulta Contínua orientada a eventos que nenhum outro banco de dados tem. E, NCache também é linearmente escalável para seus aplicativos de tempo real de alto tráfego.
Então, baixe um teste de 60 dias totalmente funcional do NCache Enterprise e experimente você mesmo.