postgresql-app.js 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138
  1. /**
  2. * Module dependencies.
  3. */
  4. const cluster = require('cluster'),
  5. numCPUs = require('os').cpus().length,
  6. express = require('express'),
  7. helper = require('./helper');
  8. // Middleware
  9. const bodyParser = require('body-parser');
  10. const Sequelize = require('sequelize');
  11. const sequelize = new Sequelize('hello_world', 'benchmarkdbuser', 'benchmarkdbpass', {
  12. host: 'tfb-database',
  13. dialect: 'postgres',
  14. logging: false,
  15. pool: {
  16. max: 50,
  17. min: 0,
  18. idle: 10000
  19. }
  20. });
  21. const Worlds = sequelize.define('world', {
  22. id: {
  23. type: 'Sequelize.INTEGER',
  24. primaryKey: true
  25. },
  26. randomnumber: { type: 'Sequelize.INTEGER' }
  27. }, {
  28. timestamps: false,
  29. freezeTableName: true
  30. });
  31. const Fortunes = sequelize.define('fortune', {
  32. id: {
  33. type: 'Sequelize.INTEGER',
  34. primaryKey: true
  35. },
  36. message: { type: 'Sequelize.STRING' }
  37. }, {
  38. timestamps: false,
  39. freezeTableName: true
  40. });
  41. const randomWorldPromise = () => {
  42. return Worlds.findOne({
  43. where: { id: helper.randomizeNum() }
  44. }).then((results) => {
  45. return results;
  46. }).catch((err) => process.exit(1));
  47. };
  48. if (cluster.isPrimary) {
  49. // Fork workers.
  50. for (let i = 0; i < numCPUs; i++) {
  51. cluster.fork();
  52. }
  53. cluster.on('exit', (worker, code, signal) =>
  54. console.log('worker ' + worker.pid + ' died'));
  55. } else {
  56. const app = module.exports = express();
  57. app.use(bodyParser.urlencoded({ extended: true }));
  58. // Set headers for all routes
  59. app.use((req, res, next) => {
  60. res.setHeader("Server", "Express");
  61. return next();
  62. });
  63. app.set('view engine', 'pug');
  64. app.set('views', __dirname + '/views');
  65. // Routes
  66. app.get('/db', async (req, res) => {
  67. let world = await randomWorldPromise();
  68. res.setHeader("Content-Type", "application/json");
  69. res.json(world);
  70. });
  71. app.get('/queries', async (req, res) => {
  72. const queries = Math.min(parseInt(req.query.queries) || 1, 500);
  73. const promisesArray = [];
  74. for (let i = 0; i < queries; i++) {
  75. promisesArray.push(randomWorldPromise());
  76. }
  77. res.json(await Promise.all(promisesArray))
  78. });
  79. app.get('/fortunes', async (req, res) => {
  80. let fortunes = await Fortunes.findAll();
  81. const newFortune = { id: 0, message: "Additional fortune added at request time." };
  82. fortunes.push(newFortune);
  83. fortunes.sort((a, b) => (a.message < b.message) ? -1 : 1);
  84. res.render('fortunes/index', { fortunes: fortunes });
  85. });
  86. app.get('/updates', async (req, res) => {
  87. const queries = Math.min(parseInt(req.query.queries) || 1, 500);
  88. const worldPromises = [];
  89. for (let i = 0; i < queries; i++) {
  90. worldPromises.push(randomWorldPromise());
  91. }
  92. const worldUpdate = (world) => {
  93. world.randomnumber = helper.randomizeNum();
  94. return Worlds.update({
  95. randomnumber: world.randomnumber
  96. },
  97. {
  98. where: { id: world.id }
  99. }).then((results) => {
  100. return world;
  101. }).catch((err) => process.exit(1));
  102. };
  103. Promise.all(worldPromises).then((worlds) => {
  104. const updates = worlds.map((e) => worldUpdate(e));
  105. Promise.all(updates).then((updated) => {
  106. res.json(updated);
  107. });
  108. });
  109. });
  110. app.listen(8080, () => {
  111. console.log('listening on port 8080');
  112. });
  113. }