mom-corte-consistente
Version:
Servicio de corte consistente para una arquitectura mom (message-oriented middleware).
134 lines (102 loc) • 3.56 kB
JavaScript
/*
param 1 = instancia de bus para gestion de eventos
param 2 = cantidad de confirmaciones externas para fin corte consistente
param 3 = estado actual del servidor. son los valores en memoria dinamica
param 4 = llamada a funcion de persistencia del negocio
param 5 = driver publicador para una arquitectura MOM
*/
module.exports = function(
bus,
corte_resp_esperadas,
estado_servidor,
persistir,
publicar
) {
var module = {};
/*
......... corte consistente
*/
var corte_en_proceso = false;
/*
numero de respuestas que espera el servidor
antes de confirmar el fin del algoritmo corte consistente
*/
var corte_resp_recibidas = 0;
var canal_entrante = new Array();
/*
si llega un pedido de corte consistente desde la cola de mensajes
este servidor deberá iniciar un proceso de propagacion del corte con
todos los canales de comunicacion abiertos (los servidores con los que intercambia informacion)
*/
bus.on("momCorte", function () {
corte_en_proceso = true;
console.log("ENT: procesando pedido corte consistente");
if(corte_resp_esperadas > 1)
console.log("INT: se esperan " + corte_resp_esperadas + " respuestas de otros servidores");
else
console.log("INT: se espera " + corte_resp_esperadas + " respuesta desde otro servidor");
persistir();
publicar();
});
/*
estas solicitudes pueden entrar desde el modo automatico en forma periodica y probabalista,
o desde el monitor cuando el sistema funciona en manual y el usuario lo solicita
*/
module.iniciarCorte = function(){
if (corte_resp_recibidas == corte_resp_esperadas)
return;
console.log("GLOBAL: comienza corte consistente");
var msg = {mw:"momCorte"};
bus.emit(msg.mw, null);
}
module.corteEnProceso = function(){
return corte_en_proceso;
}
var sock_respuesta;
module.sockRespuesta = function(socket) {
sock_respuesta = socket;
}
module.registrar = function(msg_mom){
if(msg_mom.mw === "momCorte")
corte_resp_recibidas++;
canal_entrante.push(msg_mom);
if (corte_resp_recibidas >= corte_resp_esperadas){
console.log("INT: se recibieron " + corte_resp_recibidas + " respuestas de otros servidores");
var msg = {ent:canal_entrante.slice(0), est:estado_servidor().slice(0)};
console.log("mensajes entrantes -->");
msg.ent.forEach(function(actual){
var texto;
if(actual.mw === "momCorte")
texto = actual;
else {
texto = "compra " + actual.evento.id + " => " +
actual.evento.compra.estado + " : " +
actual.evento.compra.entrega + " : " +
actual.evento.compra.reserva + " : " +
actual.evento.compra.pago + " : " +
actual.evento.compra.infracciones + " : " +
actual.evento.compra.medio;
}
console.log(texto);
});
console.log("en memoria -->");
msg.est.forEach(function(actual){
var texto = "compra " + actual.id + " => " +
actual.compra.estado + " : " +
actual.compra.entrega + " : " +
actual.compra.reserva + " : " +
actual.compra.pago + " : " +
actual.compra.infracciones + " : " +
actual.compra.medio;
console.log(texto);
});
if(sock_respuesta !== undefined)
sock_respuesta.emit("resCorte", msg);
corte_resp_recibidas = 0;
corte_en_proceso = false;
canal_entrante.length = 0;
console.log("INT: fin corte consistente");
}
}
return module;
};