hello.js 9.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356
  1. /**
  2. * Module dependencies.
  3. */
  4. var cluster = require('cluster')
  5. , numCPUs = require('os').cpus().length
  6. , http = require('http')
  7. , url = require('url')
  8. , Sequelize = require('sequelize')
  9. , mysql = require('mysql')
  10. , async = require('async')
  11. , mongoose = require('mongoose')
  12. , conn = mongoose.connect('mongodb://localhost/hello_world')
  13. , MongoClient = require('mongodb').MongoClient;
  14. // MongoDB Raw Setup
  15. var collection = null;
  16. MongoClient.connect('mongodb://localhost/hello_world?maxPoolSize=5', function(err, db) {
  17. collection = db.collection('world');
  18. });
  19. // MySQL Raw Setup
  20. var connection = mysql.createConnection({
  21. host : 'localhost',
  22. user : 'benchmarkdbuser',
  23. password : 'benchmarkdbpass',
  24. database : 'hello_world'
  25. });
  26. connection.connect();
  27. // Mongoose Setup
  28. var WorldSchema = new mongoose.Schema({
  29. id : Number,
  30. randomNumber: Number
  31. }, {
  32. collection: 'world'
  33. }),
  34. MWorld = conn.model('World', WorldSchema);
  35. // Sequelize Setup
  36. var sequelize = new Sequelize('hello_world', 'benchmarkdbuser', 'benchmarkdbpass', {
  37. host: 'localhost',
  38. dialect: 'mysql',
  39. logging: false,
  40. pool: {
  41. max: 5000,
  42. min: 0,
  43. idle: 5000
  44. }
  45. });
  46. var World = sequelize.define('World', {
  47. id: {
  48. type: 'Sequelize.INTEGER'
  49. },
  50. randomNumber: {
  51. type: 'Sequelize.INTEGER'
  52. }
  53. }, {
  54. timestamps: false,
  55. freezeTableName: true
  56. });
  57. var Fortune = sequelize.define('Fortune', {
  58. id: {
  59. type: 'Sequelize.INTEGER'
  60. },
  61. message: {
  62. type: 'Sequelize.STRING'
  63. }
  64. }, {
  65. timestamps: false,
  66. freezeTableName: true
  67. });
  68. // Helper functions
  69. function getRandomNumber() {
  70. return Math.floor(Math.random() * 10000) + 1;
  71. }
  72. // Mongoose Query Functions
  73. function mongooseQuery(callback) {
  74. MWorld.findOne({
  75. id: getRandomNumber()
  76. }).exec(function (err, world) {
  77. callback(err, world);
  78. });
  79. }
  80. // MongoDB-Raw Query Functions
  81. function mongodbDriverQuery(callback) {
  82. collection.findOne({
  83. id: getRandomNumber()
  84. }, function(err, world) {
  85. world._id = undefined; // remove _id from query response
  86. callback(err, world);
  87. });
  88. }
  89. function mongodbDriverUpdateQuery(callback) {
  90. collection.findAndModify({
  91. id: getRandomNumber()
  92. }, [['_id','asc']], {
  93. $set: {randomNumber: getRandomNumber()}
  94. }, {}, function(err, world) {
  95. world.value._id = undefined; // remove _id from query response
  96. callback(err, world.value);
  97. });
  98. }
  99. // Sequelize Query Functions
  100. function sequelizeQuery(callback) {
  101. World.findOne({
  102. where: {
  103. id: Math.floor(Math.random() * 10000) + 1}
  104. }
  105. ).complete(callback);
  106. }
  107. // MySQL-Raw Query Functions
  108. function mysqlQuery(callback) {
  109. connection.query("SELECT * FROM world WHERE id = " + getRandomNumber(), function (err, rows, fields) {
  110. if (err) {
  111. throw err;
  112. }
  113. callback(null, rows[0]);
  114. });
  115. }
  116. function mysqlUpdateQuery(callback) {
  117. connection.query("SELECT * FROM world WHERE id = " + getRandomNumber(), function (err, rows, fields) {
  118. if (err) {
  119. throw err;
  120. }
  121. rows[0].randomNumber = getRandomNumber();
  122. var updateQuery = "UPDATE world SET randomNumber = " + rows[0].randomNumber + " WHERE id = " + rows[0]['id'];
  123. connection.query(updateQuery, function (err, result) {
  124. if (err) {
  125. throw err;
  126. }
  127. callback(null, rows[0]);
  128. });
  129. });
  130. }
  131. if(cluster.isMaster) {
  132. // Fork workers.
  133. for (var i = 0; i < numCPUs; i++) {
  134. cluster.fork();
  135. }
  136. cluster.on('exit', function(worker, code, signal) {
  137. console.log('worker ' + worker.pid + ' died');
  138. });
  139. return;
  140. } else {
  141. http.createServer(function (req, res) {
  142. // JSON response object
  143. var hello = {message: "Hello, World!"};
  144. var helloStr = "Hello, World!";
  145. var path = url.parse(req.url).pathname;
  146. switch (req.url) {
  147. case '/json':
  148. res.writeHead(200, {
  149. 'Content-Type': 'application/json',
  150. 'Server': 'Node'
  151. });
  152. res.end(JSON.stringify(hello));
  153. break;
  154. case '/plaintext':
  155. res.writeHead(200, {
  156. 'Content-Type': 'text/plain; charset=UTF-8',
  157. 'Server': 'Node'
  158. });
  159. res.end(helloStr);
  160. break;
  161. }
  162. var values = url.parse(req.url, true);
  163. var queries = isNaN(values.query.queries) ? 1 : parseInt(values.query.queries, 10);
  164. queries = Math.min(Math.max(queries, 1), 500);
  165. switch (values.pathname) {
  166. // Raw MongoDB Routes
  167. case '/mongodb':
  168. var queryFunctions = [];
  169. for (var i = 0; i < queries; i += 1) {
  170. queryFunctions.push(mongodbDriverQuery);
  171. }
  172. async.parallel(queryFunctions, function(err, results) {
  173. if (!values.query.queries) {
  174. results = results[0];
  175. }
  176. res.writeHead(200, {
  177. 'Content-Type': 'application/json',
  178. 'Server': 'Node'
  179. });
  180. res.end(JSON.stringify(results));
  181. });
  182. break;
  183. case '/mongodb-update':
  184. var queryFunctions = [];
  185. for (var i = 0; i < queries; i += 1) {
  186. queryFunctions.push(mongodbDriverUpdateQuery);
  187. }
  188. async.parallel(queryFunctions, function(err, results) {
  189. res.writeHead(200, {
  190. 'Content-Type': 'application/json',
  191. 'Server': 'Node'
  192. });
  193. res.end(JSON.stringify(results));
  194. });
  195. break;
  196. // Mongoose ORM Routes
  197. case '/mongoose':
  198. var queryFunctions = [];
  199. for (var i = 0; i < queries; i += 1) {
  200. queryFunctions.push(mongooseQuery);
  201. }
  202. async.parallel(queryFunctions, function(err, results) {
  203. if (!values.query.queries) {
  204. results = results[0];
  205. }
  206. res.writeHead(200, {
  207. 'Content-Type': 'application/json',
  208. 'Server': 'Node'
  209. });
  210. res.end(JSON.stringify(results));
  211. });
  212. break;
  213. case '/mongoose-update':
  214. var selectFunctions = [];
  215. for (var i = 0; i < queries; i += 1) {
  216. selectFunctions.push(mongooseQuery);
  217. }
  218. async.parallel(selectFunctions, function(err, worlds) {
  219. var updateFunctions = [];
  220. for (var i = 0; i < queries; i++) {
  221. (function(i){
  222. updateFunctions.push(function(callback){
  223. worlds[i].randomNumber = Math.ceil(Math.random() * 10000);
  224. MWorld.update({
  225. id: worlds[i]
  226. }, {
  227. randomNumber: worlds[i].randomNumber
  228. }, callback);
  229. });
  230. })(i);
  231. }
  232. async.parallel(updateFunctions, function(err, updates) {
  233. res.writeHead(200, {
  234. 'Content-Type': 'application/json',
  235. 'Server': 'Node'
  236. });
  237. res.end(JSON.stringify(worlds));
  238. });
  239. });
  240. break;
  241. // Sequelize (MySQL ORM) Routes
  242. case '/mysql-orm':
  243. var queryFunctions = [];
  244. for (var i = 0; i < queries; i += 1) {
  245. queryFunctions.push(sequelizeQuery);
  246. }
  247. async.parallel(queryFunctions, function(err, results) {
  248. if (!values.query.queries) {
  249. results = results[0];
  250. }
  251. res.writeHead(200, {
  252. 'Content-Type': 'application/json',
  253. 'Server': 'Node'
  254. });
  255. res.end(JSON.stringify(results));
  256. });
  257. break;
  258. case '/mysql-orm-update':
  259. var selectFunctions = [];
  260. for (var i = 0; i < queries; i += 1) {
  261. selectFunctions.push(sequelizeQuery);
  262. }
  263. async.parallel(selectFunctions, function(err, worlds) {
  264. var updateFunctions = [];
  265. for (var i = 0; i < queries; i++) {
  266. (function(i){
  267. updateFunctions.push(function(callback){
  268. worlds[i].randomNumber = Math.ceil(Math.random() * 10000);
  269. worlds[i].save().complete(callback);
  270. });
  271. })(i);
  272. }
  273. async.parallel(updateFunctions, function(err, updates) {
  274. res.writeHead(200, {
  275. 'Content-Type': 'application/json',
  276. 'Server': 'Node'
  277. });
  278. res.end(JSON.stringify(worlds));
  279. });
  280. });
  281. break;
  282. // Raw MongoDB Routes
  283. case '/mysql':
  284. var queryFunctions = [];
  285. for (var i = 0; i < queries; i += 1) {
  286. queryFunctions.push(mysqlQuery);
  287. }
  288. async.parallel(queryFunctions, function(err, results) {
  289. if (!values.query.queries) {
  290. results = results[0];
  291. }
  292. res.writeHead(200, {
  293. 'Content-Type': 'application/json',
  294. 'Server': 'Node'
  295. });
  296. res.end(JSON.stringify(results));
  297. });
  298. break;
  299. case '/mysql-update':
  300. var queryFunctions = [];
  301. for (var i = 0; i < queries; i += 1) {
  302. queryFunctions.push(mysqlUpdateQuery);
  303. }
  304. async.parallel(queryFunctions, function(err, results) {
  305. res.writeHead(200, {
  306. 'Content-Type': 'application/json',
  307. 'Server': 'Node'
  308. });
  309. res.end(JSON.stringify(results));
  310. });
  311. break;
  312. default:
  313. // File not found handler
  314. res.writeHead(501, {'Content-Type': 'text/plain; charset=UTF-8'});
  315. res.end("NOT IMPLEMENTED");
  316. }
  317. }).listen(8080);
  318. }