app.js 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231
  1. /**
  2. * Module dependencies.
  3. */
  4. var cluster = require('cluster'),
  5. numCPUs = require('os').cpus().length,
  6. Hapi = require('hapi'),
  7. Sequelize = require('sequelize'),
  8. mongoose = require('mongoose'),
  9. conn = mongoose.connect('mongodb://127.0.0.1/hello_world'),
  10. async = require('async');
  11. var WorldSchema = new mongoose.Schema({
  12. id : Number,
  13. randomNumber: Number
  14. }, {
  15. collection: 'world'
  16. }),
  17. MWorld = conn.model('World', WorldSchema);
  18. var sequelize = new Sequelize('hello_world', 'benchmarkdbuser', 'benchmarkdbpass', {
  19. host: '127.0.0.1',
  20. dialect: 'mysql',
  21. logging: false,
  22. pool: {
  23. max: 5000,
  24. min: 0,
  25. idle: 5000
  26. }
  27. });
  28. var World = sequelize.define('World', {
  29. id: {
  30. type: 'Sequelize.INTEGER'
  31. },
  32. randomNumber: {
  33. type: 'Sequelize.INTEGER'
  34. }
  35. }, {
  36. timestamps: false,
  37. freezeTableName: true
  38. });
  39. var Fortune = sequelize.define('Fortune', {
  40. id: {
  41. type: 'Sequelize.INTEGER'
  42. },
  43. message: {
  44. type: 'Sequelize.STRING'
  45. }
  46. }, {
  47. timestamps: false,
  48. freezeTableName: true
  49. });
  50. if (cluster.isMaster) {
  51. // Fork workers.
  52. for (var i = 0; i < numCPUs; i++) {
  53. cluster.fork();
  54. }
  55. cluster.on('exit', function(worker, code, signal) {
  56. console.log('worker ' + worker.pid + ' died');
  57. });
  58. } else {
  59. var server = module.exports = new Hapi.Server();
  60. server.connection({port: 8080});
  61. server.views({
  62. engines: {
  63. html: require('handlebars')
  64. },
  65. path: __dirname + '/views'
  66. })
  67. server.route({
  68. method: 'GET',
  69. path: '/json',
  70. handler: function(req, reply) {
  71. reply({ message: 'Hello, World!' })
  72. }
  73. });
  74. server.route({
  75. method: 'GET',
  76. path: '/mongoose/{queries?}',
  77. handler: function(req, reply){
  78. var queries = isNaN(req.params.queries) ? 1 : parseInt(req.params.queries, 10),
  79. queryFunctions = [];
  80. queries = Math.min(Math.max(queries, 1), 500);
  81. for (var i = 1; i <= queries; i++) {
  82. queryFunctions.push(function(callback){
  83. MWorld.findOne({ id: (Math.floor(Math.random() * 10000) + 1) }).exec(callback);
  84. });
  85. }
  86. async.parallel(queryFunctions, function(err, results){
  87. if (!req.params.queries) {
  88. results = results[0];
  89. }
  90. reply(results).header('Server', 'hapi');
  91. });
  92. }
  93. });
  94. server.route({
  95. method: 'GET',
  96. path: '/mysql-orm/{queries?}',
  97. handler: function(req, reply){
  98. var queries = isNaN(req.params.queries) ? 1 : parseInt(req.params.queries, 10),
  99. queryFunctions = [];
  100. queries = Math.min(Math.max(queries, 1), 500);
  101. for (var i = 1; i <= queries; i++) {
  102. queryFunctions.push(function(callback){
  103. World.findOne({
  104. where: {
  105. id: Math.floor(Math.random() * 10000) + 1}
  106. }
  107. ).complete(callback);
  108. });
  109. }
  110. async.parallel(queryFunctions, function(err, results){
  111. if (!req.params.queries) {
  112. results = results[0];
  113. }
  114. reply(results).header('Server', 'hapi');
  115. });
  116. }
  117. });
  118. server.route({
  119. method: 'GET',
  120. path: '/fortune',
  121. handler: function(req,reply){
  122. Fortune.findAll().complete(function(err, fortunes){
  123. fortunes.push({
  124. id: 0,
  125. message: 'Additional fortune added at request time.'
  126. });
  127. fortunes.sort(function(a, b){
  128. return (a.message < b.message) ? -1 : 1;
  129. });
  130. reply.view('fortunes', {
  131. fortunes: fortunes
  132. }).header('Server', 'hapi');
  133. });
  134. }
  135. });
  136. server.route({
  137. method: 'GET',
  138. path: '/mongoose-update/{queries?}',
  139. handler: function(req, reply){
  140. var queries = isNaN(req.params.queries) ? 1 : parseInt(req.params.queries, 10),
  141. selectFunctions = [];
  142. queries = Math.max(Math.min(queries, 500), 1);
  143. for (var i = 1; i <= queries; i++) {
  144. selectFunctions.push(function(callback){
  145. MWorld.findOne({ id: Math.floor(Math.random() * 10000) + 1 }).exec(callback);
  146. });
  147. }
  148. async.parallel(selectFunctions, function(err, worlds) {
  149. var updateFunctions = [];
  150. for (var i = 0; i < queries; i++) {
  151. (function(i){
  152. updateFunctions.push(function(callback){
  153. worlds[i].randomNumber = Math.ceil(Math.random() * 10000);
  154. MWorld.update({
  155. id: worlds[i]
  156. }, {
  157. randomNumber: worlds[i].randomNumber
  158. }, callback);
  159. });
  160. })(i);
  161. }
  162. async.parallel(updateFunctions, function(err, updates) {
  163. reply(worlds).header('Server', 'hapi');
  164. });
  165. });
  166. }
  167. });
  168. server.route({
  169. method: 'GET',
  170. path: '/mysql-orm-update/{queries?}',
  171. handler: function(req,reply){
  172. var queries = isNaN(req.params.queries) ? 1 : parseInt(req.params.queries, 10),
  173. selectFunctions = [];
  174. queries = Math.max(Math.min(queries, 500), 1);
  175. for (var i = 1; i <= queries; i++) {
  176. selectFunctions.push(function(callback){
  177. World.findOne({
  178. where: {
  179. id: Math.floor(Math.random() * 10000) + 1}
  180. }
  181. ).complete(callback);
  182. });
  183. }
  184. async.parallel(selectFunctions, function(err, worlds) {
  185. var updateFunctions = [];
  186. for (var i = 0; i < queries; i++) {
  187. (function(i){
  188. updateFunctions.push(function(callback){
  189. worlds[i].randomNumber = Math.ceil(Math.random() * 10000);
  190. worlds[i].save().complete(callback);
  191. });
  192. })(i);
  193. }
  194. async.parallel(updateFunctions, function(err, updates) {
  195. reply(worlds).header('Server', 'hapi');
  196. });
  197. });
  198. }
  199. });
  200. server.start();
  201. }