Somos o departamento de desenvolvemento tecnolóxico dunha rede de venda polo miúdo. Un día, a dirección fixouse a tarefa de acelerar os cálculos a gran escala mediante o uso de Apache Ignite xunto con MSSQL e mostrou un sitio web con fermosas ilustracións e exemplos de código Java. Gustoume inmediatamente o sitio
1. Enunciado do problema
A esencia do problema é a seguinte. Hai un directorio de puntos de venda de SalesPoint e un directorio de produtos Sku (Unidade de Mantemento de Stocks). O punto de venda ten un atributo "Tipo de tenda" cos valores "pequeno" e "grande". Conéctase un surtido (lista de produtos do punto de venda) a cada punto de venda (cargado desde o DBMS) e ofrécese información de que a partir da data especificada o produto especificado
excluídos do surtido ou engadidos ao surtido.
É necesario organizar unha caché particionada de puntos de venda e almacenar nela información sobre produtos conectados cun mes de antelación. A compatibilidade co sistema de combate require que o nodo cliente Ignite cargue datos, calcule un agregado do formulario (tipo de tenda, código de produto, día, número_de_puntos_de_vendas) e cárgueo de novo no DBMS.
2. Estudo da literatura
Aínda non teño experiencia, así que empezo a bailar dende o fogón. É dicir, a partir dunha revisión das publicacións.
Artigo 2016
promete con optimismo "Estarás en marcha nun santiamén!" Estou descubrindo a configuración da variable de ambiente, vendo dous vídeos de Apache Ignite Essentials, pero non foron moi útiles para a miña tarefa específica. Lanzo con éxito Ignite desde a liña de comandos co ficheiro estándar "example-ignite.xml", construíndo a primeira aplicación
Leo máis, e alí o exemplo usa inmediatamente affinityKey (creado anteriormente mediante unha consulta SQL) e incluso usa o misterioso BinaryObject:
IgniteCache<BinaryObject, BinaryObject> people
= ignite.cache("Person").withKeepBinary();
lin
Estou refacendo a aplicación Compute para adaptala ao meu caso. A clave principal do directorio de puntos de venda en MSSQL defínese como [id] [int] NON NULL, creo unha caché por analoxía
IgniteCache<Integer, SalesPoint> salesPointCache=ignite.cache("spCache")
Na configuración xml indico que a caché está particionada
<bean class="org.apache.ignite.configuration.CacheConfiguration">
<property name="name" value="spCache"/>
<property name="cacheMode" value="PARTITIONED"/>
</bean>
A partición por punto de venda supón que o agregado necesario se construirá en cada nodo do clúster para os rexistros salesPointCache dispoñibles alí, despois do cal o nodo cliente realizará a suma final.
Estou lendo o tutorial
@Override
public void run() {
SalesPoint sp=salesPointCache.get(spId);
sp.calculateSalesPointCount();
..
}
Engado a lóxica de agregación e carga e executo nun conxunto de datos de proba. Todo funciona localmente no servidor de desenvolvemento.
Lanzo dous servidores de proba CentOs, especifico os enderezos IP en default-config.xml, executo en cada un.
./bin/ignite.sh config/default-config.xml
Os dous nodos Ignite están en execución e poden verse. Especifico os enderezos necesarios na configuración xml da aplicación cliente, comeza, engade un terceiro nodo á topoloxía e inmediatamente hai dous nodos de novo. O rexistro mostra "ClassNotFoundException: model.SalesPoint" na liña
SalesPoint sp=salesPointCache.get(spId);
StackOverflow di que o motivo do erro é que non hai unha clase SalesPoint personalizada nos servidores CentOs. Chegamos. Que tal "non tes que implementar manualmente o teu código Java en cada nodo" e así por diante? Ou "o teu código Java" non é sobre SalesPoint?
Probablemente perdín algo: comezo a buscar de novo, a ler e a buscar de novo. Despois dun tempo, teño a sensación de que lin todo sobre o tema, xa non hai nada novo. Mentres buscaba, atopei algúns comentarios interesantes.
Model classes are not peer deployed, but you can use withKeepBinary() flag
on the cache and query BinaryObjects. This way you will avoid deserialization
on the server side and will not get ClassNotFoundException.
Outra opinión con autoridade:
Artigo sobre Habré
That's it. Start (..) node using MaintenanceServiceNodeStartup file or pass
maintenance-service-node-config.xml to Apache Ignite's ignite.sh/bat scripts.
If you prefer the latter then make sure to build a jar file that will contain
all the classes from java/app/common and java/services/maintenance directories.
The jar has to be added to the classpath of every node where the service
might be deployed.
De feito, iso é todo. Aquí resulta, por que, este misterioso formato binario!
3.SingleJar
Denis ocupou o primeiro lugar na miña valoración persoal, en mi humilde opinión o titorial máis útil de todos os dispoñibles. No seu
Fágoo do mesmo xeito e consigo un único ficheiro jar que inicia "nodo de datos" ou "nodo cliente" dependendo do argumento da liña de comandos. A montaxe comeza e funciona. O despregamento cero foi derrotado.
A transición de megabytes de datos de proba a decenas de gigabytes de datos de combate mostrou que o formato binario existe por un motivo. Era necesario optimizar o consumo de memoria nos nodos, e aquí é onde BinaryObject resultou ser moi útil.
4. Conclusións
O primeiro reproche que se atopou sobre a vaguedade da documentación do proxecto Apache Ignite resultou ser xusto; pouco cambiou desde 2016. Non é fácil para un principiante montar un prototipo funcional baseado nun sitio web e/ou repositorio.
A partir dos resultados do traballo realizado, a impresión foi que Zero Deployment funciona, pero só a nivel de sistema. Algo así: BinaryObject úsase para ensinar aos nodos de clúster remotos a traballar con clases personalizadas; Implementación cero: mecanismo interno
Apache Ignite e distribúe obxectos do sistema por todo o clúster.
Espero que a miña experiencia sexa útil para os novos usuarios de Apache Ignite.
Fonte: www.habr.com