Hoje, muitas organizações usam tecnologias .NET e Java para desenvolver diferentes aplicativos de alto tráfego. Ao mesmo tempo, esses aplicativos não apenas precisam compartilhar dados entre si, mas também desejam oferecer suporte ao compartilhamento de tempo de execução de diferentes versões da mesma classe para compatibilidade com versões anteriores e redução de custos.
A maneira mais comum usada para oferecer suporte ao compartilhamento em tempo de execução de diferentes versões de classe entre .NET e aplicativo Java é por meio de Serialização XML. Mas, como você sabe, a serialização XML é um processo extremamente lento e que consome muitos recursos. Envolve validação de XML, análise, transformações, o que realmente prejudica o desempenho do seu aplicativo e usa recursos extras em termos de memória e CPU.
A outra abordagem amplamente utilizada para suportar o compartilhamento de diferentes versões de classes entre .NET e Java é por meio de banco de dados. No entanto, o problema com essa abordagem é que ela é lenta e também não se adapta muito bem com a crescente carga transacional. Portanto, seu banco de dados rapidamente se torna um gargalo de escalabilidade porque você pode dimensionar linearmente sua camada de aplicativo adicionando mais servidores de aplicativos, mas não pode fazer o mesmo na camada de banco de dados.
É aqui que um cache distribuído como NCache vem muito a calhar. NCache fornece a você uma transformação de objeto em nível binário entre diferentes versões não apenas da mesma tecnologia, mas também entre .NET e Java. Você pode mapear diferentes versões por meio de um arquivo de configuração XML e NCache entende como transformar de uma versão para outra.
NCache A estrutura de compartilhamento de versão de classe implementa o protocolo personalizado de serialização binária interoperável que gera fluxo de bytes com base no mapeamento especificado em um formato que qualquer versão nova e antiga da mesma classe pode desserializá-la facilmente, independentemente de sua linguagem de desenvolvimento, que pode ser .NET ou Java.
Aqui está um exemplo de NCache config.ncconf com mapeamento de versão de classe:
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 41 |
<cache-config name="InteropCache" inproc="False" config-id="0" last-modified="" type="local-cache" auto-start="False"> ... <type id="1001" handle="Employee" portable="True"> <attribute-list> <attribute name="Name" type="Java.lang.String" order="1"/> <attribute name="SSN" type="Java.lang.String" order="2"/> <attribute name="Age" type="int" order="3"/> <attribute name="Address" type="Java.lang.String" order="4"/> <attribute name="Name" type="System.String" order="5"/> <attribute name="Age" type="System.Int32" order="6"/> <attribute name="Address" type="System.String" order="7"/> </attribute-list> <class name="com.samples.objectmodel.v1.Employee:1.0" handle-id="1" assembly="com.jar" type="Java"> <attribute name="Name" type="Java.lang.String" order="5"/> <attribute name="SSN" type="Java.lang.String" order="2"/> </class> <class name="com.samples.objectmodel.v2.Employee:2.0" handle-id="2" assembly="com.jar" type="Java"> <attribute name="Name" type="Java.lang.String" order="5"/> <attribute name="Age" type="int" order="6"/> <attribute name="Address" type="Java.lang.String" order="7"/> </class> <class name="Samples.ObjectModel.v2.Employee:2.0.0.0" handle-id="3" assembly="ObjectModelv2, Version=2.0.0.0, Culture=neutral, PublicKeyToken=null" type="net"> <attribute name="Name" type="System.String" order="5"/> <attribute name="Age" type="System.Int32" order="6"/> <attribute name="Address" type="System.String" order="7"/> </class> <class name="Samples.ObjectModel.v1.Employee:1.0.0.0" handle-id="4" assembly="ObjectModelv1, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" type="net"> <attribute name="Name" type="System.String" order="5"/> <attribute name="Age" type="System.Int32" order="6"/> </class> </type> </data-sharing> ... </cache-config> |
como funciona NCache fazer o controle de versão de classe no compartilhamento de dados em tempo de execução?
No ncache.config que você vê acima, você notará que a classe Employee tem um conjunto de atributos definidos primeiro. Esses são atributos independentes de versão e aparecem em todas as versões de classes .NET e Java. Este é, na verdade, um superconjunto de todos os atributos que aparecem em diferentes versões. Abaixo disso, você especifica os atributos específicos da versão e os mapeia para os atributos independentes da versão acima.
Agora, digamos que você salvou o .NET Employee versão 1.0.0.0. Agora, quando outro aplicativo tenta buscar o mesmo Employee, mas quer vê-lo como Java versão 1.0 ou 2.0. NCache sabe quais atributos do .NET versão 1.0.0.0 preencher com dados e quais deixar em branco e vice-versa.
Existem muitos outros cenários que NCache lida perfeitamente para você. Por favor, leia a documentação do produto online para como NCache O compartilhamento de dados em tempo de execução funciona.
Por fim, a melhor parte é que você não precisa escrever nenhum código de serialização e desserialização ou fazer alterações de código em seu aplicativo para usar isso NCache recurso. NCache implementou um mecanismo de geração de código em tempo de execução, que gera o código de serialização e desserialização na memória de suas classes interoperáveis em tempo de execução e usa o formulário compilado para que seja super-rápido.
Em resumo, usando NCache agora você pode compartilhar diferentes versões de classe entre seus aplicativos .NET e Java sem modificar o código do aplicativo.