app.js 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241
  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://localhost/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: 'localhost',
  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!' }).header('Server', 'hapi');
  72. }
  73. });
  74. server.route({
  75. method: 'GET',
  76. path: '/plaintext',
  77. handler: function(req, reply) {
  78. reply('Hello, World!')
  79. .header('Server', 'hapi')
  80. .header('Content-Type', 'text/plain');
  81. }
  82. });
  83. server.route({
  84. method: 'GET',
  85. path: '/mongoose/{queries?}',
  86. handler: function(req, reply){
  87. var queries = isNaN(req.params.queries) ? 1 : parseInt(req.params.queries, 10),
  88. queryFunctions = [];
  89. queries = Math.min(Math.max(queries, 1), 500);
  90. for (var i = 1; i <= queries; i++) {
  91. queryFunctions.push(function(callback){
  92. MWorld.findOne({ id: (Math.floor(Math.random() * 10000) + 1) }).exec(callback);
  93. });
  94. }
  95. async.parallel(queryFunctions, function(err, results){
  96. if (!req.params.queries) {
  97. results = results[0];
  98. }
  99. reply(results).header('Server', 'hapi');
  100. });
  101. }
  102. });
  103. server.route({
  104. method: 'GET',
  105. path: '/mysql-orm/{queries?}',
  106. handler: function(req, reply){
  107. var queries = isNaN(req.params.queries) ? 1 : parseInt(req.params.queries, 10),
  108. queryFunctions = [];
  109. queries = Math.min(Math.max(queries, 1), 500);
  110. for (var i = 1; i <= queries; i++) {
  111. queryFunctions.push(function(callback){
  112. World.findOne({
  113. where: {
  114. id: Math.floor(Math.random() * 10000) + 1}
  115. }
  116. ).complete(callback);
  117. });
  118. }
  119. async.parallel(queryFunctions, function(err, results){
  120. if (!req.params.queries) {
  121. results = results[0];
  122. }
  123. reply(results).header('Server', 'hapi');
  124. });
  125. }
  126. });
  127. server.route({
  128. method: 'GET',
  129. path: '/fortune',
  130. handler: function(req,reply){
  131. Fortune.findAll().complete(function(err, fortunes){
  132. fortunes.push({
  133. id: 0,
  134. message: 'Additional fortune added at request time.'
  135. });
  136. fortunes.sort(function(a, b){
  137. return (a.message < b.message) ? -1 : 1;
  138. });
  139. reply.view('fortunes', {
  140. fortunes: fortunes
  141. }).header('Server', 'hapi');
  142. });
  143. }
  144. });
  145. server.route({
  146. method: 'GET',
  147. path: '/mongoose-update/{queries?}',
  148. handler: function(req, reply){
  149. var queries = isNaN(req.params.queries) ? 1 : parseInt(req.params.queries, 10),
  150. selectFunctions = [];
  151. queries = Math.max(Math.min(queries, 500), 1);
  152. for (var i = 1; i <= queries; i++) {
  153. selectFunctions.push(function(callback){
  154. MWorld.findOne({ id: Math.floor(Math.random() * 10000) + 1 }).exec(callback);
  155. });
  156. }
  157. async.parallel(selectFunctions, function(err, worlds) {
  158. var updateFunctions = [];
  159. for (var i = 0; i < queries; i++) {
  160. (function(i){
  161. updateFunctions.push(function(callback){
  162. worlds[i].randomNumber = Math.ceil(Math.random() * 10000);
  163. MWorld.update({
  164. id: worlds[i]
  165. }, {
  166. randomNumber: worlds[i].randomNumber
  167. }, callback);
  168. });
  169. })(i);
  170. }
  171. async.parallel(updateFunctions, function(err, updates) {
  172. reply(worlds).header('Server', 'hapi');
  173. });
  174. });
  175. }
  176. });
  177. server.route({
  178. method: 'GET',
  179. path: '/mysql-orm-update/{queries?}',
  180. handler: function(req,reply){
  181. var queries = isNaN(req.params.queries) ? 1 : parseInt(req.params.queries, 10),
  182. selectFunctions = [];
  183. queries = Math.max(Math.min(queries, 500), 1);
  184. for (var i = 1; i <= queries; i++) {
  185. selectFunctions.push(function(callback){
  186. World.findOne({
  187. where: {
  188. id: Math.floor(Math.random() * 10000) + 1}
  189. }
  190. ).complete(callback);
  191. });
  192. }
  193. async.parallel(selectFunctions, function(err, worlds) {
  194. var updateFunctions = [];
  195. for (var i = 0; i < queries; i++) {
  196. (function(i){
  197. updateFunctions.push(function(callback){
  198. worlds[i].randomNumber = Math.ceil(Math.random() * 10000);
  199. worlds[i].save().complete(callback);
  200. });
  201. })(i);
  202. }
  203. async.parallel(updateFunctions, function(err, updates) {
  204. reply(worlds).header('Server', 'hapi');
  205. });
  206. });
  207. }
  208. });
  209. server.start();
  210. }