How does facebook, gmail send the real time notification?

前端 未结 5 965
梦毁少年i
梦毁少年i 2020-11-22 09:55

I have read some posts about this topic and the answers are comet, reverse ajax, http streaming, server push, etc.

How does incoming mail notification on Gmail works

5条回答
  •  自闭症患者
    2020-11-22 10:46

    Update

    As I continue to recieve upvotes on this, I think it is reasonable to remember that this answer is 4 years old. Web has grown in a really fast pace, so please be mindful about this answer.


    I had the same issue recently and researched about the subject.

    The solution given is called long polling, and to correctly use it you must be sure that your AJAX request has a "large" timeout and to always make this request after the current ends (timeout, error or success).

    Long Polling - Client

    Here, to keep code short, I will use jQuery:

    function pollTask() { 
    
        $.ajax({
    
            url: '/api/Polling',
            async: true,            // by default, it's async, but...
            dataType: 'json',       // or the dataType you are working with
            timeout: 10000,          // IMPORTANT! this is a 10 seconds timeout
            cache: false
    
        }).done(function (eventList) {  
    
           // Handle your data here
           var data;
           for (var eventName in eventList) {
    
                data = eventList[eventName];
                dispatcher.handle(eventName, data); // handle the `eventName` with `data`
    
           }
    
        }).always(pollTask);
    
    }
    

    It is important to remember that (from jQuery docs):

    In jQuery 1.4.x and below, the XMLHttpRequest object will be in an invalid state if the request times out; accessing any object members may throw an exception. In Firefox 3.0+ only, script and JSONP requests cannot be cancelled by a timeout; the script will run even if it arrives after the timeout period.

    Long Polling - Server

    It is not in any specific language, but it would be something like this:

    function handleRequest () {  
    
         while (!anythingHappened() || hasTimedOut()) { sleep(2); }
    
         return events();
    
    } 
    

    Here, hasTimedOut will make sure your code does not wait forever, and anythingHappened, will check if any event happend. The sleep is for releasing your thread to do other stuff while nothing happens. The events will return a dictionary of events (or any other data structure you may prefer) in JSON format (or any other you prefer).

    It surely solves the problem, but, if you are concerned about scalability and perfomance as I was when researching, you might consider another solution I found.

    Solution

    Use sockets!

    On client side, to avoid any compatibility issues, use socket.io. It tries to use socket directly, and have fallbacks to other solutions when sockets are not available.

    On server side, create a server using NodeJS (example here). The client will subscribe to this channel (observer) created with the server. Whenever a notification has to be sent, it is published in this channel and the subscriptor (client) gets notified.

    If you don't like this solution, try APE (Ajax Push Engine).

    Hope I helped.

提交回复
热议问题