Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Queue vs Non Blocking I/O

So, we're designing a new micro-service architecture. One of the biggest challenge is internal communication. For communication, in which response is required, we're using REST APIs. But for the services, which just wants to relay the information, this API processing is unnecessary overhead.

One way is to use Queue. The service1 will push the information into a queue, and service2 can consume from there. Therefore service1 don't have to wait (unlike an API call). (If there is any error in processing the information, service2 can either inform via a callback URL to service1, or any other way; this is not a concern at this point [1])

Now with Queue, there are two options, one is RabbitMQ. And another is AWS SQS. With RabbitMQ I've to worry about server-setup and everything (which can be done, but wants to avoid it). So after a POC of SQS, it seems like a good option, but the thing is SQS internally uses Rest APIs to communicate with AWS servers, at both point (service1 when pushing, service2 when consuming), there will be overhead. So now I'm thinking why not do it in NodeJS, service1 will hit the service2 with information. Service2 will respond immediately, acknowledging that it has received the information, if there is any error then [1].

Now Pros/Cons I could summarise is -

RabbitMQ

  • Easy to implement
  • In case of unavailability of receiver, sender won't have to worry about retrying.
  • Server Setup Cost + Maintenance (+ Tuning)

SQS

  • Easiest to implement
  • Pricing
  • Constant Polling for Messages
  • Overhead at push/receive

Non-blocking APIs

  • No 3rd medium required for communication
  • Service1 has to manage retry mechanism
  • Relative to SQS, less overhead
  • Information will be in-memory until processed

So to some up, my question is, is it a good idea to go with Non-blocking APIs? Or which one will be better approach, in terms of making system scalable.

Edit - Can a PubSub provider like PubNub or Pusher can be used instead of Queue?

like image 402
Ashwani Agarwal Avatar asked May 19 '16 09:05

Ashwani Agarwal


People also ask

What is the difference between blocking and non blocking I O?

It enables the thread not to get stuck or blocked, waiting for the request to finish while doing I/O. Unlike blocking I/O, it doesn't wait for the I/O to complete. A non-blocking I/O operation doesn't allow the process to be on the back burner at an OS level; instead, it continues to run.

What is non blocking I O operations?

Non-blocking I/O operations allow a single process to serve multiple requests at the same time. Instead of the process being blocked and waiting for I/O operations to complete, the I/O operations are delegated to the system, so that the process can execute the next piece of code.

When Should blocking I/O be used?

Blocking I/O is preferred when the process waits for one specific event. For example, a disk or tape or keyboard read by an application program. Non-blocking, on the other hand, is appropriate when the order of I /O is not predetermined and they come from one source.

What does non-blocking mean?

Non-Blocking: It refers to the program that does not block the execution of further operations. Non-Blocking methods are executed asynchronously. Asynchronously means that the program may not necessarily execute line by line.


2 Answers

SQS uses XML over http, RabbitMQ uses AMQP, all protocols have overhead. Serializing/deserializing has a cost. Both the amazon SQS and AMQP are very efficient. I would exclude these "overheads" from your calculations, and instead focus on your other requirements.

One of the big advantages of using a queue is the handling of surge activity. If you get 100K hits, and need to send 100K messages, and you try to implement this as inter-service calls (non-blocking or otherwise), you will hit real limits on the scalability of your system (from a port count if nothing else). If you instead put 100K messages on a queue, those messages can be processed basically at the remote server's "leisure".

Additionally, as you have mentioned above, queues have a persistence that is much more difficult to implement on your own. If you data is not critical, this is not a big concern, but if this data is of higher importance, you really want something that pushes to a persistent store (Like SQS, or Rabbit persistent queues)...

like image 71
Rob Conklin Avatar answered Oct 17 '22 02:10

Rob Conklin


I am late here but off late I have started working with NON Blocking I/O and see a great benefit of NIO especially when you are calling external services which cannot be given access to a message queue. Using a fixed connection pool will ensure that 100K problem is handled with non blocking I/O and too many connections are not created.

While calling internal services a message queue is prefered, but lets say you do not have that option, you can leverage NIO with a retry mechanism and connection pooling to given you the same scalability message queues would give. This is assuming that receivers are able to handle the load of NIO calls.

like image 28
prashant Avatar answered Oct 17 '22 03:10

prashant