Node.js 难点:牛头工作有时开始,有时不';T
我已经使用cron实现了一个Redis和一个microservice,每隔1小时运行一次。有时工作开始了,有时没有,我真的不知道为什么会发生这种情况 我有一个启动后端rest api的Node.js 难点:牛头工作有时开始,有时不';T,node.js,redis,jobs,Node.js,Redis,Jobs,我已经使用cron实现了一个Redis和一个microservice,每隔1小时运行一次。有时工作开始了,有时没有,我真的不知道为什么会发生这种情况 我有一个启动后端rest api的server.js文件,一个处理队列的queue.js文件和一个将作业添加到队列的rates.js文件: server.js: import express from "express"; import cors from "cors"; import morgan from "morgan"; import Bu
server.js
文件,一个处理队列的queue.js
文件和一个将作业添加到队列的rates.js
文件:
server.js:
import express from "express";
import cors from "cors";
import morgan from "morgan";
import BullBoard from "bull-board";
import Queue from "./lib/Queue.js";
import routes from "./routes.js";
const app = express();
app.use(cors());
app.use(express.json());
app.use(express.urlencoded({ extended: true }));
// use morgan if in development
if (process.env.ENVIRONMENT === "development") app.use(morgan("dev"));
// starts the Bull Dashboard
BullBoard.setQueues(Queue.queues.map(queue => queue.bull));
app.use("/api", routes);
app.use("/admin/queues", BullBoard.UI);
app.listen(3333);
queue.js:
import Queue from "./lib/Queue.js";
Queue.process();
rate.js:
import rateJobs from "./jobs/exchangeRates/addToQueue.js";
import Queue from "./lib/Queue.js";
// clean queues
Queue.empty("SetArgentinaRate");
Queue.empty("SetBtcPrice");
Queue.empty("SetBrazilRate");
Queue.empty("SetIndiaRate");
Queue.empty("SetSouthAfricaRate");
Queue.empty("SetVenezuelaRate");
// add job to check rates
Object.keys(rateJobs).forEach(job => job);
lib/Queue.js
将所有作业导入单个对象:
import Queue from "bull";
import redisConfig from "../config/redis.js";
import * as jobs from "../jobs/index.js";
const queues = Object.values(jobs).map(job => ({
bull: new Queue(job.key, { redis: redisConfig }),
name: job.key,
handle: job.handle,
options: job.options
}));
export default {
queues,
add(name, data) {
const queue = this.queues.find(queue => queue.name === name);
return queue.bull.add(data, queue.options);
},
empty(name) {
const queue = this.queues.find(queue => queue.name === name);
return queue.bull.empty();
},
process() {
return this.queues.forEach(queue => {
queue.bull.process(queue.handle);
});
}
};
其中一项工作是设置汇率:
import Currencies from "../../models/currencies.js";
import rp from "request-promise";
export default {
key: "SetArgentinaRate",
options: {
repeat: { cron: "0 * * * *" },
backoff: { type: "exponential", delay: 30000 },
attempts: 10
},
async handle() {
// Promise all to get btc price in dest country, spread and btc price
const [btcArs, { spread }, btc] = await Promise.all([
rp.get({
uri:
"https://localbitcoins.com/bitcoinaverage/ticker-all-currencies/",
json: true
}),
Currencies.findOne({ currency: "ARS" }).select("spread"),
Currencies.findOne({ currency: "BTC" }).select("exchange_rate")
]);
// calculate exchange rate
const exchange_rate = (
(btcArs.ARS.avg_1h / btc.exchange_rate) *
(1 - spread)
).toFixed(2);
// set exchange rate to database
await Currencies.findOneAndUpdate(
{ currency: "ARS" },
{
exchange_rate,
lastUpdate: Date.now(),
$push: {
history: {
date: Date.now(),
rate: exchange_rate
}
}
}
);
}
};
下面是一个codesandbox
示例:它没有完全发挥功能,因为没有运行redis实例,但它与我实现的相同
当作业运行时,它们执行时不会出错
我使用npm run all
并行启动3个微服务:
"prod:server": "node --require dotenv/config src/server.js",
"prod:queue": "node --require dotenv/config src/queue.js",
"prod:rates": "node --require dotenv/config src/rates.js",
"start": "npm-run-all -p prod:*",
在本地主机上,作业有时启动,有时不启动。在生产过程中,他们从未开始。我不明白为什么
感谢您的帮助。提前谢谢