Friday, August 10, 2012

Debunking the Node.js Gish Gallop

A programmer who once a Ruby on Rails enthusiast switches to Node.js and thinks it's awesome, then proceeds to write a blog post about why Node is the bee's knees and Rails is crap. Attention is drawn to the changing nature of web design, from web pages with server-generated HTML to single-page JS-heavy apps written using Backbone, Ember, etc. Stop me if you think that you've heard this one before...

This is an argument I keep hearing over and over, and as far as I'm concerned it's nothing but a Gish Gallop of completely specious arguments, but I really worry... I worry because I keep hearing it over and over, and the fact that I keep hearing it over and over makes me worry that people are actually believing it. I don't know why I keep hearing it over and over. I'm not sure if people are running into problems, reading some of the prevailing "wisdom", and coming to the same conclusion or what. This really makes me sad, because whenever I read the posts like this, I do feel my previous passion for these same ideas, but for me that was half a lifetime ago, and my opinions have changed. I have been down these roads, over mountains, blazed my own trails, and then realized how stupid I was...

How do you defeat the Gish Gallop? I don't really enjoy doing this, but as far as I can tell there is no other way: we must go through the arguments one by one and show why they are completely ludicrous. So here we go...

In case you were confused, Rails is AWESOME for JSON APIs and single page applications

I love client-heavy HTML5/JS apps. I don't want every page on the web to be one, but there are many applications that can benefit a ton from keeping all of their state in the browser. In general: if you can do something without having to go across the network to do it, you will provide a better user experience, bar none.

The primary thing these applications crave are awesome JSON APIs (and Websockets... stay tuned). So why should you use Rails for a JSON API? Isn't Rails designed for HTML/JS pages? What benefit does Rails give you for building JSON APIs? And isn't Rails really slow?

Well no, I've been through this before. If you are building API-only applications with a single-page HTML5/JS frontend, you should definitely check out Rails::API. Rails::API completely eliminates any ActionView-centrism you may be worried about in Rails, and gives you awesome tools for building JSON APIs, like ActiveModel::Serializers. But that alone can't express what Rails brings to the table, so here as list of features Rails provides which are useful for JSON APIs, courtesy the Rails::API README:

Handled at the middleware layer:

  • Reloading: Rails applications support transparent reloading. This works even if your application gets big and restarting the server for every request becomes non-viable.
  • Development Mode: Rails application come with smart defaults for development, making development pleasant without compromising production-time performance.
  • Test Mode: Ditto test mode.
  • Logging: Rails applications log every request, with a level of verbosity appropriate for the current mode. Rails logs in development include information about the request environment, database queries, and basic performance information.
  • Security: Rails detects and thwarts IP spoofing attacks and handles cryptographic signatures in a timing attack aware way. Don't know what an IP spoofing attack or a timing attack is? Exactly.
  • Parameter Parsing: Want to specify your parameters as JSON instead of as a URL-encoded String? No problem. Rails will decode the JSON for you and make it available in params. Want to use nested URL-encoded params? That works too.
  • Conditional GETs: Rails handles conditional GET, (ETag and Last-Modified), processing request headers and returning the correct response headers and status code. All you need to do is use the stale? check in your controller, and Rails will handle all of the HTTP details for you.
  • Caching: If you use dirty? with public cache control, Rails will automatically cache your responses. You can easily configure the cache store.
  • HEAD requests: Rails will transparently convert HEAD requests into GET requests, and return just the headers on the way out. This makes HEAD work reliably in all Rails APIs.

Handled at the ActionPack layer:

  • Resourceful Routing: If you're building a RESTful JSON API, you want to be using the Rails router. Clean and conventional mapping from HTTP to controllers means not having to spend time thinking about how to model your API in terms of HTTP.
  • URL Generation: The flip side of routing is URL generation. A good API based on HTTP includes URLs (see the GitHub gist APIfor an example).
  • Header and Redirection Responses: head :no_content and redirect_to user_url(current_user) come in handy. Sure, you could manually add the response headers, but why?
  • Caching: Rails provides page, action and fragment caching. Fragment caching is especially helpful when building up a nested JSON object.
  • Basic, Digest and Token Authentication: Rails comes with out-of-the-box support for three kinds of HTTP authentication.
  • Instrumentation: Rails 3.0 added an instrumentation API that will trigger registered handlers for a variety of events, such as action processing, sending a file or data, redirection, and database queries. The payload of each event comes with relevant information (for the action processing event, the payload includes the controller, action, params, request format, request method and the request's full path).
  • Generators: This may be passé for advanced Rails users, but it can be nice to generate a resource and get your model, controller, test stubs, and routes created for you in a single command.
  • Plugins: Many third-party libraries come with support for Rails that reduces or eliminates the cost of setting up and gluing together the library and the web framework. This includes things like overriding default generators, adding rake tasks, and honoring Rails choices (like the logger and cache backend).
Rails has an unquestionably awesome feature set even if applied exclusively to JSON APIs, and this guy is taking it completely for granted:
"So your Rails server becomes an API, and your web site, like the iOS app, is the client. It's a clean separation of responsibilies, but given what Rails was designed to do, it's like having a horse rider climb on top of an elephant."
The design of Rails, as of Rails 1.2, provided clean abstractions for using the same code to provide server-generated HTML views and "REST" APIs in multiple serialization formats. This was a big deal at the time, and "the time" was 2 years before Node even existed. Fast forward 4 years and Rails 3 has been rewritten with an emphasis on modularization, allowing you to strip out the components you don't use and build lightweight stacks with only the things you need. Rails::API provides convention over configuration for a lightweight JSON-oriented stack.

But let me back up a little bit...
"The view in MVC is not just HTML and CSS; it's the presentation logic, and the presentation logic needs structure. With this need, client-side frameworks like Backbone, Spine, and Ember have come into the picture."
So I hear this guy Yehuda Katz worked on both Ember and Rails. You may have heard of Ember, it just won Throne of JS's framework of choice (Backbone won in the "library" category). But appeal to authority aside, what does using Ember and Rails in combination actually get you?

A problem I am certain you have run into is the manual nature of serializing JSON. Exactly how should you translate from a domain object into a JSON representation? What if the client wants to avoid repeat requests by eagerly loading other domain objects which are associated with the one you want to retrieve and including them in the JSON result? And wouldn't it be great if there were a single canonical representation for all of this that a standardized domain object abstraction running in the browser could automatically consume for us, so we don't have to manually write a bunch of JSON serialization and deserialization logic for everything in our system?

Can we put JSON on Rails? Yes we can: it's called ActiveModel::Serializers and Ember Data. All that glue code you've been writing over and over for serializing and unserializing JSON? Stop that. Seriously. You have better things to do than deal with the idiosyncrasies of whether you should wrap a particular array in an object or return a literal string or number as opposed to an object for future proofing. You are wasting your time with this minutiae and chances are the ActiveModel::Serializers representation is better than the one you are using. Let's take a look at why. 

The defining characteristics of the ActiveModel::Serializers JSON representation is that it explicitly avoids nesting objects within objects, instead preferring to keep the resulting structure flat and using IDs to correlate the relationships between data in the structure. Here is an example of a "post" object which includes comments and tags, taken from the ActiveModel::Serializers README:
{
  "post": {
    "id": 1,
    "title": "New post",
    "body": "A body!",
    "comments": [ 1, 2 ]
  },
  "comments": [
    { "id": 1, "body": "what a dumb post", "tags": [ 1, 2 ] },
    { "id": 2, "body": "i liked it", "tags": [ 1, 3 ] },
  ],
  "tags": [
    { "id": 1, "name": "short" },
    { "id": 2, "name": "whiny" },
    { "id": 3, "name": "happy" }
  ]
}
There are multiple nested relationships in this document: the post has many comments, and comments have many tags. And yet we don't see duplication of comment or tag objects. We don't have to worry about which version of a repeated object is canonical, because there are no repeated objects. Objects within the resulting document are deduplicated and referred to symbolically by their ID. Using this JSON structure we can represent arbitrarily nested relationships between objects in the most efficient manner possible and completely avoid any problems with inconsistencies between duplicated versions of objects present in the document. This representation of JSON just makes sense, and perhaps you too have standardized upon it. Better yet, if you use this representation, then with very little effort on your part Ember Data can automatically consume it.

If you use Ember and Rails, you can abstract away JSON and save yourself the headache of writing custom serialization code. I'm going to say: score one for Rails and single page applications. Maybe you have some Node thing that can do that too, I don't know, but seriously, if you think Rails is bad for JSON APIs, you don't know Rails.

Moving right along, let's continue slogging through the Gish Gallop.

Node has nonblocking async I/O and Rails doesn't so Rails is slow!!!

Where to start with this one. Hmm, let's start here:
"When I think of Ruby and Rails' performance, I think of Ilya Grigorik."
Let me start by saying that Ilya is an awesome guy who has done a very thorough and nuanced survey of the many facets of Ruby performance over time. Taking any single thing he's said out of context and treating it like gospel is probably doing a disservice to Ilya. That said, let's see what thing Ilya said that this guy chose to single out and present out of context. Quoth Ilya:
"There is nothing about node that can't be reproduced in Ruby or Python (EventMachine and Twisted), but the fact that the framework forces you to think and use the right components in place (fully async & non-blocking) is exactly why it is currently grabbing the mindshare of the early adopters. Rubyists, Pythonistas, and others can ignore this trend at their own peril. Moving forward, end-to-end performance and scalability of any framework will only become more important."
So this is a line I hear out of Ryan Dahl a lot too. It's a line I used to believe.

Folks, I've been doing this stuff for awhile. I first discovered synchronous I/O multiplexing when I was about 15, which for me was half a lifetime ago, and since then I've been building network servers using this approach. I've built my own abstraction layers across select/poll/epoll/kqueue. I wrapped libev for Ruby in Rev/Cool.io and nio4r, the latter of which is a cross-platform abstraction for Java NIO on JRuby. I cannot express to you how much work I've invested in doing things the evented non-blocking way.

I don't think non-blocking I/O is a good fit for web applications that talk HTTP, although I think it can be a good fit for Websocket applications. I will get to my reasons later. But first, let's continue digging through the Gish Gallop:
"Ilya mentioned the framework/ecosystem that I now consider to be the threat to Rails: Node.js [...] The biggest thing I noticed was the difference in performance. It consumed less memory than Ruby, and it served more requests per second than Sinatra or even Rack."
I have a huge pet peeve, and that's when people talk about performance without numbers. I tried it and it was faster. I tried it and it was slower. If you really want to make a point about the performance of a particular thing, can you at least pretend you're using science?

I hate to do this, but I think I have to destroy your god. Let's see how Ilya's software stacks up to mine on a crappy "hello world" web server benchmark. First, the numbers for my web server Reel:

# httperf --num-conns=50 --num-calls=1000

Ruby Version        Throughput    Latency
------------        ----------    -------
JRuby HEAD          5650 reqs/s   (0.2 ms/req)
Ruby 1.9.3          5263 reqs/s   (0.2 ms/req)
JRuby 1.6.7         4303 reqs/s   (0.2 ms/req)
rbx HEAD            2288 reqs/s   (0.4 ms/req)
Let's compare to Ilya's web server Goliath, as well as Thin and Node.js:
Web Server          Throughput    Latency
----------          ----------    -------
Goliath (0.9.4)     2058 reqs/s   (0.5 ms/req)
Thin    (1.2.11)    7502 reqs/s   (0.1 ms/req)
Node.js (0.6.5)     11735 reqs/s  (0.1 ms/req)
All of these servers, including mine, are using non-blocking evented I/O. Is that remotely relevant? No. That's just a coincidence.

My web server is faster than Ilya's. So by Gish Gallop logic, Ilya must be wrong about everything. There must be no reason to use Ilya's web server. Let's write everything in Node since it won the benchmark.

There's a huge problem here: Goliath does things that Reel, Thin, and Node's HTTP server don't do. The reason it's slower isn't because Ilya sucks and is clueless about performance. The reason is that Goliath has features which these other web servers don't, which makes it an apples to oranges comparison. (I guess scumbag me for putting them all in a big list on the Reel web page)

The same can be said of Rails: it probably isn't ever going to have better latency through the entire stack  than any Node.js framework, but the latency of the Rails stack is probably going to be a lot less than your application logic, and that's still going to be a drop in the bucket compared to the network latency to a given user.

Celluloid solves every single problem you're whining about better than Node

Node has a lot of problems, and I'm not just talking about the audience it attracts. Let me start by saying this: many of the things I have built in Celluloid are based off of technologies originally developed for Node. My web server Reel uses the Node HTTP parser, and it's quite likely that the next iteration of nio4r I develop will be based off of libuv.

All that said, let me start with Node's fundamental problem: callback-driven I/O. Celluloid::IO is one of many systems, including Erlang and Go, that demonstrate that "nonblocking" and "evented" I/O are orthogonal to callbacks. Celluloid uses Ruby's coroutine mechanism to provide a synchronous I/O API on top of an underlying nonblocking system. However, where systems like Node force you to use nonblocking I/O for everything, Celluloid lets you mix and match blocking and nonblocking I/O as your needs demand.

If you have ever worked in a language like C(++) or Java, you probably know an amazing property of sockets: you can mix and match blocking and nonblocking I/O, even over the lifecycle of a single socket. Perhaps you will handle incoming sockets in a nonblocking manner at first, but if they make a complex request, you might change the socket to a blocking mode and hand it off to a worker thread.

Celluloid::IO makes this handoff completely transparent: simply by giving the socket to another Ruby thread which isn't a Celluloid::IO actor, it will automatically switch from nonblocking to blocking mode completely transparently.

But let's talk about Node's real fundamental problem, one that is extremely difficult to solve in any callback-driven system: flow control. Unfortunately the Node.js community has adopted the phrase "flow control" to mean "building abstractions around managing callbacks", however the phrase "flow control" has a very specific definition relating to the rates at which data is transmitted between systems.

In general, callback-driven systems can't manage flow control effectively. The most notable pathological case is the producer-consumer problem, whereby a slow consumer might force a system like Node to unboundedly buffer data from an unchecked producer. There's a clear and simple solution to this problem: make all I/O synchronous. Using coroutines that provide blocking-style APIs, you can easily compose producer/consumer problems in a manner that doesn't result in unbounded writes to a buffer, because simply by virtue of a virtual blocking API, the rate at which data is transfered from producer to consumer is kept in check.

But what about WebSockets?

Ruby has had some pretty awesome albeit overlooked and therefore stagnant solutions for WebSockets for awhile, like Cramp. I've been working on web-based push technologies for half a decade now, and explored a multitude of solutions including Comet, XMPP/BOSH, RabbitMQ long polling, and my own XHR long polling systems which I originally built around *gasp* threads nearly 3 years ago at this point.

Well, I'm quite happy to say that Reel now supports WebSockets. I certainly don't want to say that my recent spike is anywhere as mature as WebSockets in Node or their surrounding ecosystem. Instead, I think the API that Reel provides for WebSocks is simply better by design. If you managed to catch tenderlove's recent blog post on streaming live data, you may understand that all previous APIs you may have encountered in both systems like Rails or Node for streaming data were really obscuring the one API that truly makes sense for this use case: a socket.

WebSockets are in many ways similar to 0MQ sockets (which are used in DCell via Celluloid::ZMQ). WebSockets provide a framing mechanism which provides a message-based transport instead of the typical stream-based transport provided by TCP. That said, when processing message sequences, callbacks become extremely problematic, because you must reconstruct the state of the current request from the point of each incoming message. Callbacks work well for e.g. a chat protocol where there is no state relationship between messages, but as soon as there is you are effectively stuck building a finite state machine to manage the processing of each incoming message.

This is madness. There's a much better and much more straightforward solution to this problem: just use the goddamn stack. In order to do so, you need to provide a "blocking" API, but this isn't orthogonal to using nonblocking I/O. Celluloid::IO, Go, and Erlang all let you build concurrent, multithreaded, and potentially multicore systems on top of coroutines spread across multiple native threads.

That said, native threads are cheap nowadays and they're only getting cheaper. On most Ruby VMs a native thread will cost you about 20kB of RAM. If you want you can just build blocking I/O systems completely out of native threads without using any sort of evented I/O, and these systems can scale up to tens of thousands of connections.

Don't believe the hype

Node provides a limited subset of what Ruby can do, and it can be done better with Ruby. Node does not have a web framework of the same caliber as Rails. Node doesn't have threads, which in Ruby will spare you from Node's callback soup. Finally, there's the elephant in the room: JavaScript is a terrible, terrible programming language compared to Ruby. We're forced to use JavaScript in the browser, but on the server, we can choose the best language for the job.

Ruby on Rails remains the best-in-class web framework, and while there are arguments to be made against it, the ones I hear coming out of confused Node.js detractors do not hold water.

699 comments:

«Oldest   ‹Older   601 – 699 of 699
Escorts Service said...


If you have been searching nearest escorts service then you can easily contact to noida escorts book now:
http://www.aiyshawalia.com/

romikakkar said...

Spend your best time with Hyderabad escorts service,latest and hottest russian call girls.Independent call girls service hyderabad

khairatabad call girls ***
lingampally call girls ***
mehdipatnam call girls ***
film nagar call girls ***
begumpet call girls ***
gachibowli call girls ***
madhapur call girls ***

Mileydsuza said...

You are making a mistake. Take the service of the Noida Escorts and make your step count toward satiation. We offer the finest escorts service that holds an exclusive and exotic flavor that content your soul.
Bawana Independent Escorts ##
Bela Road Independent Escorts ##
Bhajanpura Independent Escorts ##
Bhogal Independent Escorts ##
Bhorgarh Independent Escorts ##
Bijwasan Independent Escorts ##
Budh Vihar Independent Escorts ##
Chanakyapuri Independent Escorts ##
Chand Nagar Independent Escorts ##

Unknown said...

bhubaneswar escorts ###
bikaner escorts ###
amravati escorts ###
pune escorts ###
pune call girls ###

janvikaushik said...

You can Visualize Our Genuine Efforts In Every Turn Of The Service Of The Escorts In Aerocity Delhi. Nothing can come in comparison with the efforts that we make to satiate your sensual desires. You can connect with us for getting a high-class escort service that fulfills all your erotic needs.
Dhaula Kuan Escorts Service #
East Of Kailash Escorts Service #
Greater Kailash Escorts Service #
Indirapuram Escorts Service #
Vasundhara Escorts Service #
Janakpuri Escorts Service #
Kalkaji Escorts Service #
Kapashera Escorts Service #
Lajpat Nagar Escorts Service #

meenakshiroy said...


Delhi escorts agency is now open in your nearby. you can enjoy with hot girls and spent magic moments of life.
sujata arora

Poonam das

Miss riya

Manisha malik

sanamkhan said...

Spicy and Sexy Escort Girl in Sriniwaspuri are fully eager to take place of your sex associate. Our Escorts agency have hottest Escorts agency in Sriniwaspuri, We are equipped with smartest Call Girls Service in Sriniwaspuri
sriniwaspuri escorts service

dwayne johnson said...

How to fix Alexa Not Working? Alexa Not Working or Alexa Not Responding, Alexa Slow to Respond, Echo Dot Slow to Respond, Echo Dot Not Responding, Alexa Device Unresponsive, Alexa Does Not Respond, Alexa Won't Connect to WiFi, and more issues appear sometimes, but don’t worry, just dial Alexa Helpline Number, available 24/7.

Alexa Slow to Respond

Echo Dot Not Responding

Echo Dot Does Not Respond

Smartechohelp

dwayne johnson said...

Resolve Alexa Not Working now! Just reach Alexa Helpline, techies available 24/7 to assist you to fix Alexa Not Responding, Alexa Slow to Respond, Echo Dot Slow to Respond, Echo Dot Not Responding, Alexa Device Unresponsive, Alexa Does Not Respond, Alexa Won't Connect to WiFi, etc instantly.

Alexa Not Responding

Alexa Slow to Respond

Alexa Device Is Unresponsive

sanamkhan said...

If you are in search of the best female companion to take her in business parties, events and occasion just come here and hire our beautiful Escorts in Connaught place at nominal prices. You can choose escort as per your choice and demand, just click on our website and filter the best escort to get fun and pleasure of life.
Connaught Place escorts

aiyshagoyal said...

Dwarka Escorts services available in Dwarka and have an effect on you are in Dwarka and looking for a few Girls for enjoyment unaided in Dwarka also our Hot Dwarka Escort and call girls is outstanding partners for you.
dwarka escorts

sweeptakes said...

My DISH Perks Discover Alaska Sweepstakes - my dish.com/win Winner will receive an Oculus VR headset package.

dwayne johnson said...

Why Is My Alexa Slow to Respond/Not Responding? To fix Why Alexa Slow to Respond, Alexa Not Responding, Echo Dot Slow to Respond, Echo Dot Not Responding, Alexa Echo Not Responding, Alexa Connection Issues, Alexa Issues, Alexa Does Not Respond, Alexa Device is Unresponsive, etc. Don’t worry, just dial Alexa Helpline Number Toll-Free at 1 800-795-6963, experts available 24/7 to help you troubleshoot instantly.

Alexa Not Responding

Alexa Not Working

Alexa Does Not Respond

Alexa Connection Issues

Alexa Device Not Responding

Echo Dot Not Responding

Echo Dot Does Not Respond

aiyshagoyal said...

Contact us for loving and independent Call girls in Mahipalpur. Our Escort service in Mahipalpur is available 24x7. We provide hot girls.
mahipalpur escorts

Unknown said...

connaught place escorts ||-->
nehru place escorts ||-->
mahipalpur escorts ||-->
malviya nagar escorts ||-->
kalkaji escorts ||-->

Ankita Sharma said...

Be that as it may, we can oversee for you just if you are our exceptional customer and be chosen by our Gurgaon Escorts group, you additionally can appreciate the most bewitching wonders under the class of VIP Gurgaon Escorts. The explanation is that the provincial delights are thrilling to such an extent that they give an alternate inclination in a hotbed of Gurgaon Escorts.

Goa Babes said...

bicholim escorts service ###
Female escorts in Goa ###
Female escorts in Goa ###
Female escorts in Goa ###
Female escorts in Goa ###
Female escorts in Goa ###
Female escorts in Goa ###
Female escorts in Goa ###

Ankita Sharma said...

In case you are interested in enjoying a sip of drink with a gorgeous Aerocity Escorts, it means you can fulfil your dream and for that, the only little thing you have to do is simply getting in contact with Khushi Independent Aerocity Escorts who would arrange everything for you. It is not that hard to find suitable Aerocity Escorts who can deliver you satisfied and fulfilled escorting services.

tanvikaur said...

mehrauli escorts ####
sarojini nagar escorts ####
preet vihar escorts ####
vasant vihar escorts ####
gaur city escorts ####

Unknown said...

Why HP Printer Not Printing in Black? Don’t worry, experts there round the clock to help you Fix Why HP Printer Not Printing, HP Printer Not Printing in Colour, Hp Printer Not Printing Colors Correctly, Hp Printer Not Printing Anything, Hp Printer Not Printing Double Sides, Hp Printer Not Printing Wirelessly, etc, you're just need reach Hp Printer Helpline Number Toll-Free at 1 800-983-7116, experts there 24/7 in your service.

Hp Printer Not Printing

Hp Printer Not Grabbing Paper

Hp Printer Not Printing Double Sides

Hp Printer Not Printing Wirelessly

HP Printer Not Printing Black

HP Printer Problem with Printhead

Hp Printers Help

Security Cam Helpline said...

My Arlo Camera Keeps Going Offline How to Fix It? To fix Arlo Camera Offline or Arlo Not Recording All Motions, just reach on Toll-Free Arlo Camera Support Phone Number at 1 800-983-7116, techies available 24/7 and provide best solution to fix Why Arlo Camera Says Offline, Arlo Camera Not Recording, Arlo Camera Not Recording When Motion Detected, Arlo Won't Connect to WiFi, etc, so be sure to call or visit Securitycamhelpline.

Arlo Camera Keeps Going Offline

Arlo Camera Not Recording

Connect Arlo Camera to WiFi

How To Reset Arlo Camera

Arlo Camera Setup

Security Cam Helpline

Sonam Sharma said...

Vip South Ex Escort College Call Girl Available 24/7 In Delhi Ncr

We Are High-Class Elite South Ex Escort Agency, Providing A Quality, Honest Escort Services To Discerning Lady And Gentlemen Located In India. We Provide A South Ex Escort Service That Is Second To None. One That Is Total To The Client Who Wants To Escape The Usual & Proceed To Experience Of Unforgettable & Discreet South Ex Escort Services.women Seeking Men for christmas night
South Ex Escorts
South Ex Escort

Ravika Singh said...

Do you want something that makes you calm and relax? So, you don’t need to
worry about it because you are going to be served up with the hotties via
connecting our escorts in jaipur.
https://escortservicesinjaipurcity.com/
https://escortservicesinjaipurcity.com/delhi-escort-service/
https://escortservicesinjaipurcity.com/noida-escorts-service/
https://escortservicesinjaipurcity.com/gurugram-escort/
https://escortservicesinjaipurcity.com/escort-service-in-jaipur/
https://escortservicesinjaipurcity.com/jaipur-escorts/
https://escortservicesinjaipurcity.com/jaipur-escort-service/
https://escortservicesinjaipurcity.com/jaipur-call-girls-service/
https://escortservicesinjaipurcity.com/contact-us-jaipur-call-girls/

Damini Sharma said...

Clients are never stressed over the sum they spend to enlist an Aerocity Escorts. We share the photographs of Aerocity Escorts which are accessible at an opportunity to ensure that your time isn't squandered and you get the best. When you get joined by an Aerocity Escorts from our agency then it will leave an effect on people as though you are with your better half or sweetheart.

Damini Sharma said...

There are various social orders with which you may discover adoration and in like manner stay far away from various things which you're not good for doing when you need them so if by the by you are looking out warmth, by then, you could choose self-governing Saket Escorts. My call is Escorts and I am a reasonable Saket Escorts. you ascend as so glad so our Saket Escorts affiliation gives you these spotlights on only one name and experience numerous raptures on your life.

Damini Sharma said...

We are Model Delhi Escorts one of the specific experts and engaging Escorts suppliers to every last one of every one of you. You are welcome to our affiliation on the off chance that you are chasing down the best Delhi Escorts for the most private conditions spent together to essentially fulfil you. We are fiery and young Delhi Escorts for every single one of us.

jacksoncooper said...

Having any errors with your kindle? Kindle won’t connect to wifi? There is nothing to be afraid of as it is just a very common issue that can be easily fixed. If you need expert help, then we are ready to help you. Our skilled team offers you the best solution. To know more check out the website Ebook Helpline.

lucynelson said...

Getting canon printer won't connect to wifi? Don’t worry we will help you in fixing this error. Our team is very dedicated and skilled and will provide you with the best solution within minimum time. We are available round the clock to help you. To know more visit Printer Offline Error.

Damini Roy said...


We - a principle Mahipalpur Escorts organization Escorts in Mahipalpur - are satisfied with our brilliant, able, and elegant divas. These women have all that you can ask for and what all can make you feel decreased from all of the burdens and nerves seeking after you.
Mahipalpur escorts
Mahipalpur escorts
Mahipalpur escorts
Mahipalpur escorts

Damini Sharma said...

Groups of independent escorts' friendship are cooperating in Delhi. In a visit through escorts agency so far you have met many Delhi Escorts yet this time we are introducing probably the best escort labourers who are capable in all withdraw like dating, sensual, body knead, and so forth in a Delhi Escorts various amusement plans are accessible and you know them when you will meet them then various sexual momenta can be performed through the suggestive energy which has been made for the appreciating the sentimental force, for example, all joys are accessible by the Delhi Escorts Service.

Amy Garg said...

!! Vip Escort Near Radisson Blu Mahipalpur

!! Independent Call Girls Near Radisson Blu MBD Hotel Noida

!! Female Escorts Near Radisson Blu Paschim Vihar

!! Russian Escorts Near Radisson Blu Plaza Delhi Airport

!! Call Girls Near Red Fox Hotel Aerocity

!! Escorts Service Near Savoy Suites Noida

!! Escorts Near Shangri La Eros Hotel Connaught Place

!! Vip Escort Near Sheraton Hotel Saket

Damini Sharma said...

My name is Renu and I am a free model young girl working in Delhi as independent Delhi Escorts. I'm independent for incall and outcall purposes. If you are a customer of an escort agency, at that point you know in a way that is better than what an escort woman offers this support of a customer and how a customer appreciates this delight, for example, all highlights are respected about this Delhi Escorts agency. At the point when you planned to enlist an escort young lady and prepared to make an instalment for this calling, for example, you need to know the subtleties of the Delhi Escorts profile with whom you might want to invest brilliant energy.

Damini Sharma said...

The Saket Escorts have fabricated their bends and figures only for you. They are sitting tight for you to take them alongside you. If you have been exhausted by your sweetheart who doesn't energize you any longer, get yourself in the agency of Saket Escorts. She will be your new sweetheart for one evening. Call them to five-star lodgings and play around with them. She has everything in her that can light your faculties and make you go insane.

poojaroyescorts said...

If you are looking for a good job, Delhi might be one of the best alternatives for you. Here you may have to live alone, away from home and family. So you could feel alone and be gripped by depression. The Vasant Kunj Escorts are always there to take care of your loneliness.

Book Now:Vasant Kunj Escorts

Book Now:Call Girls in Vasant Kunj

Visit us:Book 24x7 Online Vasant Kunj Escorts

Damini Sharma said...

There are different sorts of Delhi Escorts. If you are looking through various types of classification, at a similar spot then it is the correct spot for you since we have a group of various Delhi Escorts are appropriated among the classifications and you may discover without meandering on this web see the accompanying sorts of escorts Services are related with Delhi Escorts Agency, for example, given underneath.

Bob Smith said...

Need help if your Outlook Stops Working? Just grab your phone and feel free to Reach Emails Help Toll-Free Helpline Number +1 800-983-7116, experts available 24/7 at your service to provide Instant Solutions to problems like Outlook Not Working, Emails Not Sending From Outlook, Outlook Not Loading, Outlook Not Loading Emails, Outlook Not Sending Emails, Outlook Password Forget, etc.

Outlook Not Working

Outlook Password Forget

Outlook Not Sending Emails

Outlook Forget Password

Access Gmail With Outlook

Outlook Email Support

Email Not Sending From Outlook

Fun said...

Erotic beautiful girls are willing to possess clients who pays them money as they wants or moreover they expect from their clients in exchange for his delightful enjoyment in Night.

Lucknow escorts service
Lucknow Call girls service
Goa escorts service
Goa Call girls service

Bob Smith said...

Unable to find a solution to the Roadrunner Email Not Working problem? Just relax and feel free to reach at Emailshelp toll-free number +1 800-983-7116, experts available 24*7 at your service for Instant help like Roadrunner Email Not Working, Roadrunner Email Support, Roadrunner Email Login, Roadrunner email password reset, Roadrunner Login for Email, Roadrunner Email, and so on.


Roadrunner Email Support

Roadrunner Email Not Working

Bob Smith said...

Are you tired of SignIn Gmail Account? No Worries!! Just relax and feel free to reach at toll-free number +1 800-983-7116, experts available 24/7 for resolving issues related to Gmail like Gmail Down, Gmail Not working, Gmail not loading, Gmail keeps stopping, Forgot my Gmail password, Forgot Gmail Account and so on.

Gmail Not Working On iPhone

Gmail down

Gmail Password Forgot

Gmail Not Working

Aerocity Escort Service said...

Aerocity Escort Service

Damini Sharma said...

Now it comes to exploring their rates on the website. Every professional agency has a full-fledged website, and they keep updating their information every so often. You may examine the qualities of Aerocity Escorts services through their website. On the other hand, it is also easy to know about their profile as the Escorts in Delhi keep updating their profile details to help their clients understand her. It will help you select the one which meets up your sexual preferences. Most Beautiful Delhi Escorts help their clients personalize their erotic services to enjoy every erotic moment affordably.

Escort Service in Noida said...

Escort Service in noida
escort service in ghaziabad
escort service in Meerut

so said...

مكافحة حشرات بالاحساء
تنظيف خزانات بالرياض
مكافحة حشرات بالرياض
شركة نقل عفش بالرياض
تسليك مجاري بالرياض
تنظيف بالدمام
غسيل سيارات بالبخار بالرياض

ندى المدينة

Sonam Sharma said...

Find Something Special, Find Delhi Escort Service in India
Our agency is offering the top-class Delhi Escorts services that can blow your mind and can give you a lot of fun just because of their presence. They will not let you be lonely or alone, because they are well trained and independent Delhi Escort who have the ability that how to impress a guy in few seconds
Delhi Escorts
Delhi Escorts

Payal Singh said...
This comment has been removed by the author.
Ishika Sharma said...

As Delhi Escorts, I am potential for a hotel in Borivali. inside the centre of the dress with me to put on, I can observe your choice. I practice genuine cosmetics and especially specialize in my work. I see speeding in Western companies. I put on historical sarees that oppose the right curves of my body.

Lajpat Nagar Escorts said...

They have an amazing body to investigate during the gathering with her. You will truly flabbergasted subsequent to watching her lavish way of life and obviously dream to see her at your soonest in your room. Delhi Escorts can be an extraordinary turn in your life, so on the off chance that you need to see her in your place, reach us to track down the best according to your solicitation.

Delhi Escorts Service | Escorts Service in Delhi

Lajpat Nagar Escorts said...


As we all these days are familiar with the con artists and con artists, our Escort and call young ladies Agency in Hauz Khas has certain proposals which cause it to a notable spot. we accept that put stock in intense produce in this cutting edge globe however our Hauz Khas Escorts and call young ladies alongside our Celebrity Escort and call young ladies, Airhostess Escort and call young ladies and Higher instruction Escort and call young ladies in Hauz Khas are endeavoring to support this have confidence in.

Escorts Service in Hauz Khas

Delhi Escorts said...

Great job, I love your posts and wish you all the very best...…
Our top call girls are moving into the city to provide the No.1call girls service in Delhi. You can Call and book our ultra-sexy Ashram Escorts girls. 💋💃💛

Ishika Sharma said...

If you were been in Delhi you can understand living in part area. It could be a bit difficult to reach the opposite area to have sexual pleasure. That's why we are bringing the services to every corner of the capital in India. There are few familiar areas in capital where we offer the Delhi Escorts Service.

Faridabad Jyoti said...

Faridabad Jyoti is the best hindi news channel in Faridabad. We are providing the latest and breaking Faridabad news in hindi from Delhi NCR and Haryana such as live coverage, COVID-19 news, weather report, traffic report, sports news, in-depth reporting, video, photos and all local area news covering.

Faridabad breaking news
Faridabad latest news today
Faridabad Ki news

khushisinha said...

An escort agency is the right place for the clients to book model escorts and this time you can arrange a hookup or full night with Karol Bagh Escorts by choosing the sexy services of our company.
Karol Bagh Escorts

rubinapaha said...

Independent call girls Mumbai
Mumbai escorts
Independent Mumbai escort

Delhi Call Girls said...

Very Reasonable Price 100% Safe and Independent Call Girl in Karol Bagh available 24 hours. Call Girls In Delhi Call Girls and Call Girls in Punjabi Bagh In Hot Female Model Escort in Delhi and College Girls in Delhi Call Girl in Punjabi Bagh available 24 hours, Munirka, Malviya Nagar, Lajpat Nagar, Nehru Place, Safdarjung, Rk Puram, Call Girls in Karol Bagh, Kailash Colony, All, Original Escort agency Delhi/NCR


Whatsapp/Call+91-9871368411


Tilak Nagar Escorts
Paschim Vihar Escorts
Pitampura Escorts
Tilak Nagar Escorts
Paschim Vihar Escorts
Pitampura Escorts
Tilak Nagar Escorts
Paschim Vihar Escorts
Pitampura Escorts
Call Girls in Tilak Nagar
Call Girls in Tilak Nagar
Call Girls in Tilak Nagar
Call Girls in Laxmi Nagar
Call Girls in Laxmi Nagar
Call Girls in Laxmi Nagar
Call Girls in Karol Bagh
Call Girls in Karol Bagh
Call Girls in Karol Bagh
Call Girls in Punjabi Bagh
Call Girls in Punjabi Bagh
Laxmi Nagar Escorts
Laxmi Nagar Escorts
Laxmi Nagar Escorts
Karol Bagh Escorts
Karol Bagh Escorts
Karol Bagh Escorts
Punjabi Bagh Escorts
Punjabi Bagh Escorts
Delhi Escorts
Delhi Call Girls

radhika said...

escorts in hyderabad
hyderabad escort service
hyderabad call girl
call girl in hyderabad
escort service in hyderabad
hyderabad escort
hyderabad escorts service
hyderabad call girl number
call girls in hyderabad
hyderabad escorts
call girls service in hyderabad
escort service hyderabad

khushisinha said...

Don't think if you will not be able to avail the services of Desi Indian Bhabhi Escorts in Dehradun on the net platform we bring you online escorts booking site and once you are about to be up-to-date with Dehradun Escorts These are mature escorts ladies Dehradun call girl are awesome and lovely and at this point, you can book escorts from a net escort agency.
Nainital Escorts

Mr Roy said...

Bên mình nhận Vận chuyển hàng đi Campuchia

R1se Hluoluo said...

Tipe sayur yang memiliki kandungan vitamin U salah satunya ialah kol, tomat, bayam, parsley, kubis brussel, dan kale. Bermacam tipe sayur yang memiliki kandungan vitamin U, bisa dibuat jadi juice tanpa ada gula atau dimakan pada keadaan mentah.

Dalam riset yang dikerjakan Dr Garnett Cheney pada 1950-an, disebut makna dari U dalam vitamin U ialah ulcers atau cedera. https://ramuanobattradisional.com/ Vitamin ini sesungguhnya dikelompokkan selaku enzim yang dikenali bernama s-methylmethionine.

Bukan gombalan biasa! Belakangan ini, nama “vitamin U” kembali muncul. Vitamin ini pertamanya kali disampaikan di tahun 1950 oleh Garnett Cheney dalam juice kubis pada riset berkenaan penyembuhan tukak pencernaan.

Escorts Service Kolkata said...

escorts
escorts
escorts
escorts
escorts
escorts
escorts
escorts

kajalescort said...

Bhubaneswar Escort a good vary of escorts decision women assortment here check it :- faculty women / freelance Model's Receptionist/ married woman /Highly edu cated girls and far a lot of on the market. decision American state together with your want.We area unit here to meet your want and dreamz. If you wish decision women in your building or your shrub space ! simply decision Below signaling..+91 7873777779

Geek Info said...

Ujjivan small finance bank net banking

ujjivan personal loan

UCO bank balance check

Block PNB Atm card

Baroda Rajasthan Kshetriya Gramin Bank

HDFC Credit Card balance

track ICICI Bank credit card

Abhyudaya bank mobile banking regitration

BOB ATM card apply

UBI net banking

blackjacksite.top said...

Great blog! Do you have any tips for aspiring writers? I’m hoping to start my own blog soon but I’m a little lost on everything.

온라인카지노

Kanika Sethi said...

Export-Import Data Solutions is the best import-export data provider to fetch updated import and export data from. We have lots of data records of India. You can collect useful customs details such as exporter name, HS code, company name, product description, buyers from these data records.

Rishika Gupta said...

There is no doubt that when it comes to the world’s biggest importer, the Kenya is on top. A lot of people are crazy about making a professional bond with the Kenya. But in reality, it is not an easy task. To attempt this task, you need a solution named as Kenya trade Data. It helps to directly enter the business of export-import in the Kenya. This data contains every detail of shipments took place in the Kenya. The shipping records are used to observe customer preferences, product demand, and market scenarios from depth.

Dump Kingdom said...

dementia and alcohol abuse
lethal dose of soma
new jersey inpatient detox center
social drinking vs problem drinking
morphine sulfate rehab

Upgrade VLSI Technologies said...

The delightful article you have posted here. This is a good way to increase our knowledge. Continue sharing this kind of articles, Thank you.Vlsi Training with Placement

oncasinositenet said...

I love your blog.. very nice colors & theme. Did you create this website yourself or did you hire someone to do it for you? Plz reply as I'm looking to create my own blog and would like to find out where u got this from. thanks a lot. Feel free to visit my website; 바카라

Nathan said...

Very informative Blog! There is so much information here that can help thank you for sharing.
Data Science Training in Lucknow

Gurugram Girls Pg said...

Your comment is very beautiful, it is very different, it is very good, there is nothing in this comment that does not look good, wish you could write such posts.
Yoga
Night Party Girls
Covid 19
Night Club
Goa Party

Unknown said...

Thank you for sharing excellent information. I’ve learned a lot from your blog here, Keep on going my friend.

Transformer Manufacturers in India

Transformer Manufacturers in Mumbai

Samuel said...

Play Tic Tac Toe

aljani said...

#1 The Best Apps and Games For Android · Apk Module
https://apkmodule.com/stripchat-mod-apk-downlaod-for-android/
Stripchat Mod Apk Downlaod For Android

Tech Institute said...

We are really grateful for your blog post. You will find a lot of approaches after visiting your post. Great work thank you.
Business Analytics Course in Chandigarh

Raziah Lauretta said...

How to: Get Windows 11 Right Now For FREE
Do You Need A Microsoft Account For Windows 11 Home
Will Your PC Run Windows 11
How to: Change Taskbar Size in Windows 11
My Thoughts On Windows 11
How to: Take a Screenshot on Iphone
How to: Force Restart, Enter DFU, Recovery Mode on iPhone 11/11 Pro
How To: Reset & Restore your Apple iPhone 12
How To: Reset & Restore your Apple iPhone 7
How to: Reset & Restore your Apple iPhone X

jantahu8 said...

Ok, thanks for the information and have a good day! get-mobdro.com

เว็บ เกม สล็อต said...

สมัคร Pg Slot การเล่น สล็อต สมัครง่าย ผ่านระบบอัตโนมัติ 3 วินาที ทำให้ทุกคนเพลินใจ ไปกับการเล่น สล็อต ได้ทุกหนทุกแห่ง ส่วนกระบวนการลงทะเบียน เป็นสมาชิกนั้น ไม่ยุ่งยาก ททางเว็บ

ทดลองpg รับฟรีเครดิต said...

โปรโมชั่น pg slot มากมาย เล่นง่ายจ่ายจริง แตกจริง ต้อง PG-สล็อต เท่านั้น! เล่นสล็อต พีจีสล็อต เว็บไซต์ตรงผู้ให้บริการเกมสล็อตออนไลน์ชั้นหนึ่ง ทกลอง เล่น ฟรี พร้อมโบนัส

ayushanant said...

Really impressed! Information shared was very helpful Your website is very valuable. Thanks for sharing.
Food Consultingt

bhanusuru597 said...

"If you can't dazzle them with brilliance, Baffle them with bullshit." ..... Extreme edition, I guess.

sexypg168 said...
This comment has been removed by the author.
bhanusuru597 said...

I see this tactic used a lot in political discussions. And I see people who are razor-sharp in identifying bad faith attacks like that, then completely fall for it in this context. Lower stakes and all, since it's just a show, but the dissonance is so weird.

anusree said...

nice blog

bhanusuru597 said...

I wanted to leave a little comment to support you and wish you the best of luck. We wish you the best of luck in all of your blogging endeavors.
https://www.routerlogin.net/

pikashow

bhanusuru597 said...

"However, where systems like Node force you to use nonblocking I/O for everything, Celluloid lets you mix and match blocking and nonblocking I/O as your needs demand."

myassignmenthelp21 said...

Great Post
If you're struggling with your academic assignments, My Assignment Help Singapore is here to provide you with the best assignment help Singapore. Our team of professional assignment helpers in Singapore is dedicated to delivering top-quality papers that meet your specific requirements. We offer a wide range of services, including essay writing, research paper writing, dissertation writing, and more. With our affordable prices and timely delivery, you can trust us to get the job done right the first time.

bhanusuru597 said...

Ruby on Rails remains the best-in-class web framework, and while there are arguments to be made against it, the ones I hear coming out of confused Node.js detractors do not hold water.
netgear login/

pikashow apk

Unknown said...

ông ty vận tải Sen Vàng là một trong những công ty hàng đầu trong lĩnh vực vận tải hàng hóa ở Việt Nam. Với hơn 10 năm kinh nghiệm trong ngành, Sen Vàng đã xây dựng được một đội ngũ nhân viên chuyên nghiệp, giàu kinh nghiệm và luôn cố gắng để đáp ứng tốt nhất nhu cầu của khách hàng.

Chúng tôi cung cấp dịch vụ vận chuyển hàng hóa Bắc Nam dọc theo Quốc lộ 1A và các quốc lộ tỉnh lộ trong cả nước. Với đội xe tải chở hàng lớn với đầy đủ tải trọng đáp ứng mọi nhu cầu vận chuyển của khách hàng. Ngoài ra, Sen vàng cung cấp dịch vụ vận chuyển hàng liên tỉnh đi khắp 63 tỉnh thành từ Bắc vào Nam đảm bảo an toàn và giao hàng nhanh chóng.

Hãy liên hệ với với đội ngũ tư vấn của chúng tôi để có giải pháp vận chuyển an toàn và tiết kiệm.


CÔNG TY CỔ PHẦN VẬN TẢI SEN VÀNG

Địa chỉ: Số 286 Nguyễn Xiển, Thanh Xuân, Hà Nội

Kho bãi: Đường Phan Trọng Tuệ, Tả Thanh Oai, Thanh Trì, Hà Nội

Điện thoại: 0388.123.215 - 0974.940.893

Email: vantaisenvang24h@gmail.com

Website: https://xetaichohang.com.vn

bhanusuru597 said...

The streaming api is all built with callbacks so I find your assertion that callbacks can't handle the backpressure problem to be really odd considering how obsessed the core node team is about doing backpressure correctly.

johnson said...

I really enjoyed reading this article. It was very informative and gave some great tips on how to improve our blog comments. I think it's important to be respectful and thoughtful when commenting, as it can make a big difference in how people view your comments. Additionally, it's important to keep an open mind and be willing to learn from other people's perspectives. Lastly, I believe it's beneficial to be polite and show appreciation for the time and effort the author put into writing their piece.
Divorcio sin oposición barato en Virginia

RUNNY919 said...

nice blog







watch stories
cc generator

bhanusuru597 said...

I love client-heavy HTML5/JS apps. I don't want every page on the web to be one, but there are many applications that can benefit a ton from keeping all of their state in the browser. In general: if you can do something without having to go across the network to do it, you will provide a better user experience, bar none.

sclinbio said...

Excellent weblog, many thanks a lot for your awesome posts! leer mas
our web site sclinbio,com

sclinbio said...

This is such a great information to start with DevOps, thanks a ton for all your good work!!!
our https/sclinbio.com/-

VISWA Technologies said...

Every weekend I used to visit this site because I wish for enjoyment since this site conations genuinely good course information too.
Datastage Training
Oracle BPM Training

sclinbio said...

Very good information,thanks for sharing. our clinical data mangement service in hyd sclinbio.com

800CreditNow said...

Don't let a low credit score hold you back any longer. Discover the key to boosting your credit score with 800creditnow. Our experts provide personalized financial solutions to help you build your credit score and achieve your goals. Call us today at (+1) 844-422-2426 for expert guidance on how to increase credit score.

800CreditNow
How to Increase Credit Score?
Ways to Raise Credit Score
Increase Credit Score
Increase Credit Score Fast
Auto Loans for Bad Credit
How to Get a Loan on Bad Credit
Loan on Bad Credit
Avail Auto Loan for Bad Credit

800CreditNow said...

Elevate your financial future with 800creditnow. Discover effective Ways to Raise Credit Score and achieve your long-term goals. Whether you're aiming to Raise Your Credit Score or seeking to Fix Your Credit, our team of experts provides tailored Financial Solutions to meet your needs. Reach at (1) 844-422-2426 to learn how to Boost Your Credit Score Fast.

800CreditNow
How to Increase Credit Score?
Ways to Raise Credit Score
Increase Credit Score
Increase Credit Score Fast
Auto Loans for Bad Credit
How to Get a Loan on Bad Credit
Loan on Bad Credit
Avail Auto Loan for Bad Credit

Joy elizabeth said...

Your blog post "Debunking the Node.js Gish Gallop" properly addresses frequent misconceptions and criticisms around Node.js. It is a comprehensive and instructive work. The plethora of false allegations made against Node.js is rightly referred to as "Gish Gallop," and your methodical dismantling of these assertions is admirable. To improve the article, though, think about include more particular case studies or examples that highlight Node.js's scalability and performance in actual applications. Furthermore, adding pointers or best practices for Node.js application optimization could improve the text even more and give users useful information. All things considered, it's a useful tool for anyone trying to learn more about Node.js and counter false accusations.abogado dui charlotte va

Akriti Verma said...

Your offerings are simply fantastic! I've delved into your content before, and Urfi Hot must say, you never cease to amaze with your magnificence.

«Oldest ‹Older   601 – 699 of 699   Newer› Newest»