前言:
公司转栈,已是前端….
正文:
项目的坑如下 巨坑 rethinkdb 真的是学到了,之前都不知道还有这个东西,在并行10做map操作的时候,对一个表进行多次扫描导致连接不能释放cpu压力250%爆炸,对集合进行比较复杂的聚合操作加上并行直接GG 此数据库在集合层面还不能保证原子性,可以说是项目重构的主要原因。 rethinkdb插入查询性能都还可以 1ms以内,复杂聚合需要125ms加上并行扫表聚合和数据集合的庞大(60字段)CPU和内存爆掉。。
并行转串行,串行转并行。在数据库扫表的时候出现一个问题,因为不能保证原子性,要先查再做更改,而扫表的监听操作是不确定的这时候需要放到一个栈里面,然后java架构说不靠谱,挂了岂不是数据就丢失了,好吧,后来设计成redis锁+队列。rabbitmq要设置basic.qos信令 prefetch_count,让消费者一次接受1个,当存在锁的时候使用nack回到队列不标记此消费者失败,也就是当锁阻塞多个消费者的时候,消息之后还可以通过这几个消费者,而不是reject后GG只能走第一个抢占的.
const key = "audit-lock-execute";
const ttl = 4;
exports.consumeTransactionAudit = async function (message, _channel) {
try {
let payloadStr = message.content.toString();
let unlock = await __executeLock(ttl, key);
if (unlock === 1) {
return _channel.nack(message, false);// 如果锁被占用,nack回消息
}
await exports.auditTransaction(JSON.parse(payloadStr).audit);
_channel.ack(message);
unlock();
} catch (err) {
logger.error('消费consumeTransactionAudit...出错了,错误信息是', err);
_channel.reject(message, true);
}
};
生产者锁保证生产状态意外结束其他进程起来负责生产(只能监听一个扫表行为防止重复)
exports.audit = function () {
setInterval(function () {
try {
alive();
} catch (err) {
logger.error('task/audit ', err);
}
}, 1000);
};
let status = false;// 进程锁,默认为false代表未锁住
// 更新生存周期,60秒判定失去进程
async function alive(_status) {
if (status === false) {
let result = await redisClinet.get('active-audit-lock');
if (result === null) {
__processLock();
}
}
if (arguments.length !== 0 || status === true) {
if (_status === true) {
status = _status;
}
if (status === true) {
// logger.info(`${process.pid}获得进程锁,锁定60秒...`);
await redisClinet.set('active-audit-lock', `1`, 'EX', 60);
}
}
}
function __processLock() {
logger.info(`${process.pid}准备争取进程锁...`);
let key = 'audit-lock';
let ttl = 61;
warlock.lock(key, ttl, function (err, unlock) {
if (err) {
// Something went wrong and we weren't able to set a lock
return;
}
if (typeof unlock === 'function') {
if (status === false) {
require("./process/audit.js");
}
alive(true);
}
});
}
还有一个电子票的部分,用pantomjs生成的pdf 需要4S左右,用golang纯线条画0.5S都不用还可以并行。而node的并行并状态维护太麻烦。
项目最终用java重构,虽然不是node的锅但还是被甩锅了,java架构问我写不写java,我大概就表示了下java垃圾就像黑我们node一样GG。现在安排在公司写前端,准备放弃,寻找下一个公司。他说了一句话node是前端的东西,尴尬了,从此对java转黑在java这种工业级语言面前我们都是菜鸡….
另外纠正下对JWT的误解,jwt在多个终端时可以保证状态不易被更改,jwt鉴权也学到许多。
