IEMS 5722 Mobile Network Programming and Distributed Server Architecture

Similar documents
IERG 4080 Building Scalable Internet-based Services

IEMS 5780 / IERG 4080 Building and Deploying Scalable Machine Learning Services

Producer sends messages to the "hello" queue. The consumer receives messages from that queue.

IERG 4080 Building Scalable Internet-based Services

Celery-RabbitMQ Documentation

IEMS 5722 Mobile Network Programming and Distributed Server Architecture Semester 2

MOM MESSAGE ORIENTED MIDDLEWARE OVERVIEW OF MESSAGE ORIENTED MIDDLEWARE TECHNOLOGIES AND CONCEPTS. MOM Message Oriented Middleware

Playing tasks with Django & Celery

IEMS 5722 Mobile Network Programming and Distributed Server Architecture

Maintaining Spatial Data Infrastructures (SDIs) using distributed task queues

Cluster Upgrade Procedure with Job Queue Migration.

MSG: An Overview of a Messaging System for the Grid

Data Acquisition. The reference Big Data stack

Homework 9: Stock Search Android App with Facebook Post A Mobile Phone Exercise

Building a Real-time Notification System

Time and Space. Indirect communication. Time and space uncoupling. indirect communication

Indirect Communication

IEMS 5722 Mobile Network Programming and Distributed Server Architecture

Storm. Distributed and fault-tolerant realtime computation. Nathan Marz Twitter

COMMUNICATION IN DISTRIBUTED SYSTEMS

Orchestrating Big Data with Apache Airflow

Data Acquisition. The reference Big Data stack

AWS Lambda: Event-driven Code in the Cloud

CS50 Quiz Review. November 13, 2017

Microservices, Messaging and Science Gateways. Review microservices for science gateways and then discuss messaging systems.

IEMS 5722 Mobile Network Programming and Distributed Server Architecture

django-celery Documentation

CS 571 Operating Systems. Midterm Review. Angelos Stavrou, George Mason University

DS 2009: middleware. David Evans

ChatBlazer 8 Site Administrator Usage Guide

Notes. Submit homework on Blackboard The first homework deadline is the end of Sunday, Feb 11 th. Final slides have 'Spring 2018' in chapter title

Beating the Final Boss: Launch your game!

ebay Marketplace Architecture

National College of Ireland BSc in Computing 2015/2016. Mahmoud Azzam LocalDeal. Final Report

Web Applications. Software Engineering 2017 Alessio Gambi - Saarland University

Western Michigan University

Design and Architecture. Derek Collison

From the event loop to the distributed system. Martyn 3rd November, 2011

Integration Service. Admin Console User Guide. On-Premises

Lecture 21 11/27/2017 Next Lecture: Quiz review & project meetings Streaming & Apache Kafka

Backup Tab. User Guide

Software Requirement Specification

/ Cloud Computing. Recitation 8 October 18, 2016

Architectural Styles I

Learn Well Technocraft

Common Design Principles for kdb+ Gateways

Cisco pxgrid: A New Architecture for Security Platform Integration

Electronic Payment Systems (1) E-cash

MOG Installation, Configuration, and Upgrade

Getting Started with AWS IoT

Channel Allocation for Social Networking Features on Publish/Subscribe-based Mobile Application

Genesys Mobile Services Deployment Guide. Most Common System Errors

Scaling Web Apps With RabbitMQ

Message Queueing. 20 March 2015

Backup Tab User Guide

Developing Enterprise Cloud Solutions with Azure

Enhancing cloud applications by using messaging services IBM Corporation

Distributed Middleware. Distributed Objects

Storm. Distributed and fault-tolerant realtime computation. Nathan Marz Twitter

Database Architectures

Scaling DreamFactory

HOW PERSISTENT CHAT SERVER WORKS

Review. Fundamentals of Website Development. Web Extensions Server side & Where is your JOB? The Department of Computer Science 11/30/2015

TIBCO StreamBase 10 Distributed Computing and High Availability. November 2017

XVIII. Software Architectures

Mary Kay Social Publisher. Sales Force Tutorial

ebay s Architectural Principles

Building loosely coupled and scalable systems using Event-Driven Architecture. Jonas Bonér Patrik Nordwall Andreas Källberg

Introduction to Protocols for Realtime Data Sharing. Deepti Nagarkar

Discussion CSE 224. Week 4

Introduction in Eventing in SOA Suite 11g

Chapter 4: Threads. Operating System Concepts 9 th Edition

Startups and Mobile Apps on AWS. Dave Schappell, Startup Business Development Manager, AWS September 11, 2013

A Web-Based Application for Automatic Evaluation of Programming Assignments

UNIT:2. Process Management

A framework to monitor activities of satellite data processing in real-time

AMQP and Beyond. Messaging by Extending RabbitMQ. Tony Garnock-Jones

PROFILE OPTIONS FOR CONCURRENT MANAGER(CM)

Achieving Scalability and High Availability for clustered Web Services using Apache Synapse. Ruwan Linton WSO2 Inc.

Announcements. Program #1. Program #0. Reading. Is due at 9:00 AM on Thursday. Re-grade requests are due by Monday at 11:59:59 PM.

Distributed Systems Project 4 Assigned: Friday March 20 Due: Friday April 3, 11:59pm

Deccansoft Software Services

LogicomUSA s SoftSwitch Overview and Architecture

Student Guide INTRODUCTION TO ONLINE RESOURCES

Module 6 Node.js and Socket.IO

NoSQL Databases Analysis

Scaling Slack. Bing Wei

How to Route Internet Traffic between A Mobile Application and IoT Device?

Project Avatar: Server Side JavaScript on the JVM GeeCon - May David Software Evangelist - Oracle

Intellicus Cluster and Load Balancing- Linux. Version: 18.1

Copyright 2016 Pivotal. All rights reserved. Cloud Native Design. Includes 12 Factor Apps

Enable IoT Solutions using Azure

CIS192 Python Programming

django-simple-sms Documentation

CGI Architecture Diagram. Web browser takes response from web server and displays either the received file or error message.

ITP 140 Mobile Technologies. Mobile Topics

Brief introduction of SocketPro continuous SQL-stream sending and processing system (Part 1: SQLite)

LECTURE 27. Python and Redis

Script Execution Job Extension

IEMS 5722 Mobile Network Programming and Distributed Server Architecture

Transcription:

Department of Information Engineering, CUHK MScIE 2 nd Semester, 2016/17 IEMS 5722 Mobile Network Programming and Distributed Server Architecture Lecture 9 Asynchronous Tasks & Message Queues Lecturer: Albert C. M. Au Yeung 9 th March, 2017

The HTTP Request-Response Cycle The application server only performs work whenever there is a request from the client The client waits for the response before the application server has completed its work and returns a response Client Application Server Database 2

The HTTP Request-Response Cycle The HTTP request-response cycle is expected to complete in a short time (no one likes waiting!) However, not all tasks can be completed in a short time Therefore, it is necessary to carry out some tasks in the background (i.e. outside the HTTP request-response cycle) Client Application Server Database 3

Example There are a lot of scenarios in which background tasks are necessary Consider a mobile app in which notifications will be sent to your friends when you have shared a new file Share a new file Your Application Google GCM Apple APNS Send notifications 4

Example Consider a social network in which you need to quickly retrieve the list of mutual friends of two users Key-Value Store Request a list of mutual friends of User A and B Your Application Worker computes mutual friend lists periodically to update the key-value store Mutual Friends Database Worker 5

Asynchronous Tasks Task carried out outside the HTTP response-request cycle are called asynchronous (non-blocking) tasks Achieve de-coupling by separating the application server and other services Client 1 Send request Application Server 2 Submit asynchronous task(s) Workers 3 Send response 4 Workers carry out the tasks in the background 6

Regular Jobs A simple way to implement asynchronous tasks is to schedule jobs in the system to be run at specific time (and periodically) For example: Update various counters in the system (e.g. number of users, posts, messages) Generate a list of recommended friends for a user Compute the similarity of two products based on user feedbacks in a e- commerce site Collect information from an external source (e.g. news or weather info) 7

Cron Cron is a scheduler in Unix/Linux for setting up regular jobs Type crontab -e to edit the configuration file (cron table) Each line in the configuration file defines a single job * * * * * command to execute # # # day of week (0-6) # month (1-12) # day of month (1-31) # hour (0-23) # min (0-59) 8

Cron Examples Run at 10:30am everyday 30 10 * * * /home/user/program.py Run at the 0 th minute of every hour 0 * * * * /home/user/program.py Run at 6pm on every Wednesday 0 6 * * 3 /home/user/program.py Run every 10 minutes on Monday to Friday */10 * * * 1-5 /home/user/program.py 9

Limitation of Cron Jobs Cron is used to schedule periodic tasks. However: Requests send to your server may not be evenly distributed across time Not all tasks can be finished within a certain amount of time It is not trivial to incorporate logic or load balancing in carrying out a set of related jobs And there are other requirements too 10

Asynchronous Tasks It can be non-trivial to implement asynchronous tasks: Tasks may have to be executed sequentially There can be a lot of concurrent tasks Tasks may have different priorities Different tasks may require different amount of resources We need some middle man to help us manage the tasks/messages between the server application and the workers 11

Message Queues Producer Application Server Submit tasks / messages Message Queue Distribute or notify workers about the tasks / messages Consumers Worker / Service Worker / Service Broker Worker / Service 12

Message Queues By having a broker between the application server and the services, we actually have a more robust system Free the HTTP request-response cycle from heavy tasks Clients are shielded from failures of background tasks If there is a failure, the broker can make sure that the task is submitted again for retry 13

Asynchronous Message Queues A popular way of implementing asynchronous message queue in Python applications involves using the combination of the following: Celery as the task queue RabbitMQ as the message broker Redis as the backend data store 14

RabbitMQ 15

RabbitMQ One of the commonly used open source message broker software. Some features include: Delivery acknowledgement Clustering and queues mirroring Client libraries available in many programming languages Management UI References: https://www.rabbitmq.com/ http://blogs.vmware.com/vfabric/2013/03/scaling-real-time-comments-huffpost-live-withrabbitmq.html http://blogs.vmware.com/vfabric/2013/03/how-indeed-com-handles-35-million-job-postings-perday-using-rabbitmq.html 16

RabbitMQ Architecture when using RabbitMQ as the message broker (Note: the components below do not necessarily reside on the same machine) Submit messages to queue(s) RabbitMQ Workers consumer messages from the queue(s) Worker / Service Application Server Maintains one or more message queues Worker / Service Worker / Service 17

RabbitMQ For installation, refers to https://www.rabbitmq.com/download.html RabbitMQ uses the AMQP protocol for message passing AMQP = Advanced Message Queuing Protocol An application layer protocol for sending and receiving messages Defines how messages are routed and stored in the broker Defines how communications are done between clients and server (broker) 18

RabbitMQ Sending Messages In Python, we can install a module that help us use AMQP to talk to RabbitMQ (e.g. pika) The block on the right shows an example of submitting a message to a queue in RabbitMQ import pika connection = pika.blockingconnection( pika.connectionparameters('localhost')) channel = connection.channel() channel.queue_declare(queue= queue001 ) channel.basic_publish( exchange='', routing_key= queue001, body= This is a message! ) connection.close() Ref: https://www.rabbitmq.com/tutorials/tutorial-one-python.html Put this in your server application 19

RabbitMQ Consuming Messages Consuming a message requires more complex codes, as it involves creating a callback function to handle incoming message import pika connection = pika.blockingconnection(pika.connectionparameters(host= localhost )) channel = connection.channel() channel.queue_declare(queue= queue001 ) def callback(ch, method, properties, body): print Received %r % (body,) channel.basic_consume(callback, queue= queue001, no_ack=true) channel.start_consuming() Ref: https://www.rabbitmq.com/tutorials/tutorial-one-python.html Execute this script on the worker machine 20

RabbitMQ The above example refers to the most basic usage of RabbitMQ A single queue with a single consumer Producer Message Queue Consumer What if we want to have more consumers to share the load, introduce different types of messages,? 21

RabbitMQ Distributing messages among multiple workers Simply create more workers and make them consume from the same queue RabbitMQ will distribute messages to them in a round-robin fashion Consumer Producer Message Queue Consumer 22

RabbitMQ In the previous example, one message will be delivered to exactly one consumer only In some cases, we would like to delivery the message to all consumers Publish / Subscribe model Examples: consider monitoring changes in some statistics (stock price, weather condition, etc.) Useful when multiple actions have to be taken (by subscribers) when something happens (at a publisher) 23

RabbitMQ Exchanges A core concept in RabbitMQ Producer usually sends a message to an exchange, which will dispatch the message to zero, one or more queues according to some logic defined there Further decouple the producer(s) and the consumer(s) Producer X Reference: https://www.rabbitmq.com/tutorials/amqp-concepts.html 24

RabbitMQ Type of Exchanges 1. Direct Route message directly to the queue specified by the routing key 25

RabbitMQ Type of Exchanges 2. Fan-out Route message to all queues that are bound to the exchange Also known as the pub/sub model Useful in MMOG, sports news sites, group chats, stock price updates, etc. 26

RabbitMQ Type of Exchanges Broadcast message to all consumers at once (publish/subscribe model) Setup an exchange and let the exchange submit messages to multiple queues for multiple consumers Queue 1 Consumer Producer X Queue 2 Consumer 27

RabbitMQ Type of Exchanges 3. Topic Route message to queues whose names match the pattern given in the routing key Useful in distributing messages based on some criteria, such as geographical location, news update with categories, etc. 4. Headers Ignoring the routing key, and route messages based on the values in header fields 28

RabbitMQ Type of Exchanges Messages can also be routed by the exchange based on their topics, e.g.: user.login.* Queue 1 Consumer Producer X Image.*.* Queue 2 Consumer Ref: https://www.rabbitmq.com/tutorials/tutorial-five-python.html 29

RabbitMQ RabbitMQ is a general purpose message broker, you can implement the producers and consumers using different technology and languages (as long as you use the AMQP protocol) PHP Script Python Scripts Flask Application RabbitMQ C/C++ Programs Shell Scripts Java Applications 30

Events vs. Commands The content of the message can be customised to your needs You can issue commands. E.g. increment user s number of likes You can also issue events. E.g. user ID=3 likes photo ID=5 In general, it is better to send messages of events (make your application event-driven!) Events can be consumed by workers responsible for doing different tasks Allow better isolation between systems Do not need to hard-code actions in your application 31

Message Queues in a Distributed System Message queues are very important in distributed systems for several reasons Allow de-coupling of different components Isolate sub-systems so that they become less independent Ensure the correct order of executing a sequence of tasks Enable faster response to write requests, because the actual write action can be taken by background workers in an asynchronous way 32

Celery 33

Celery A distributed task queue written in Python for Python apps It has to be supported by a message broker (e.g. RabbitMQ) Allow implementation of asynchronous tasks to be more integrated into your Python application Confused? Ref: http://www.celeryproject.org/ 34

Celery Before you use Celery: Producer Consumer RabbitMQ Producer Consumer 35

Celery After you use Celery Allows you to send messages / invoke asynchronous tasks by simply making a function call in Python Helps you manage your workers (e.g. restart them in case of a failure or if an exception is raised) RabbitMQ Consumer Consumer Celery Producer Producer Producer 36

Celery Example Let s start from defining the asynchronous task you want to perform Give the module a name (e.g. tasks ) Define a task from celery import Celery app = Celery( tasks, broker= amqp://guest@localhost// ) @app.task def countwordsinwebpage(url): content = downloadurlcontnt(url) words = countwords(content) hash = updatedatabase(words) return hash Specify the URI of the RabbitMQ server 37

Celery Example After defining the tasks, run the Celery worker server with: $ celery A tasks worker Start Celery, which will host the worker And then you can perform the defined tasks asynchronously in your application: from tasks import countwordsinwebpage url = https://en.wikipedia.org/wiki/rms_titanic countwordsinwebpage.delay(url)... Invoke the delay method to perform the task asynchronously Import the function from your task module 38

Celery In many cases, you simply want to submit a task and are not concerned about the result (e.g. user likes and article, user comments on a photo, etc.) In other cases, you may want to keep track of the status of the task (e.g. let the user know about the progress of uploading a file) For the latter case, Celery needs a backend storage to temporarily stores the states of the asynchronous tasks Usually Redis is used as the backend 39

Celery Used to store the states and results of tasks RabbitMQ Consumer Consumer Redis (Key-value Store) Celery Producer Producer Producer 40

Celery Setting the backend of Celery: from celery import Celery app = Celery( tasks, backend= redis://localhost, broker= amqp://guest@localhost// ) @app.task def countwordsinwebpage(url): content = downloadurlcontnt(url) words = countwords(content) hash = updatedatabase(words) return hash 41

Celery Once you have a backend, you can check the status of a task submitted:... result = countwordsinwebpage.delay(url) task_id = result.task_id... from celery.result import AsyncResult result = AsyncResult( my-task-id ) result.ready() # True if the task is finished result.result # The return value of the task result.state # The current state of the task 42

Celery The components can all be set on different machines for scalability (Workers should be pointed to the URI of the same message broker) Message Broker Server RabbitMQ Celery Worker Worker Server 1 Celery Worker Worker Server 2 Celery + Server Application Redis Celery Worker Worker Server 3 Application Server Database Server 43

Celery + Flask You can easily integrate Celery with your Flask application Firstly, define a function that creates a new Celery object: from celery import Celery def make_celery(app): celery = Celery(app.import_name, broker=app.config['celery_broker_url']) celery.conf.update(app.config) TaskBase = celery.task class ContextTask(TaskBase): abstract = True def call (self, *args, **kwargs): with app.app_context(): return TaskBase. call (self, *args, **kwargs) celery.task = ContextTask return celery 44

Celery + Flask Then, create a Flask app and use it to initialise the Celery object and define some tasks using the @celery.task() decorator from flask import Flask app = Flask( name ) app.config.update( CELERY_BROKER_URL= amqp://guest@localhost, CELERY_RESULT_BACKEND= redis://localhost:6379 ) celery = make_celery(app) @celery.task() def add(a, b): return a + b 45

Celery + Flask Then, you can create asynchronous tasks by invoking the functions in your application. For example: @app.route('/') def do_add(): add.delay(2,3) return Done Ref: http://flask.pocoo.org/docs/0.10/patterns/celery/ https://github.com/miguelgrinberg/flask-celery-example 46

Celery + Flask Before deploying your Flask app, you will also have to start the worker using Celery, for example: $ celery A app.celery worker If you need more debug information, use the loglevel parameter: $ celery A app.celery worker --loglevel=debug Ref: http://flask.pocoo.org/docs/0.10/patterns/celery/ https://github.com/miguelgrinberg/flask-celery-example 47

A simple example can be found here: Flask App: https://gist.github.com/albertauyeung/0c3a7cbd1fd4e08caa182fbcaa566fff Celery Task: https://gist.github.com/albertauyeung/a3e6be3eba4e8e40083e673c18837f26 48

Asynchronous Message Queues + NoSQL Database 49

Case Study Consider a social application, in which users can be friends of each other. What are some of the common operations? Get a list of friends of a given user Get a list of common friends of two given users Recommend a user add other users as friends if they are friends of his/her friends 50

Case Study A straight-forward way of storing the friendship network is to use a table with the following schema in a relational database: TABLE friendship user_id friend_id is_friend_since Column TYPE 1 2 2015-05-07 user_id INTEGER 2 1 2015-05-07 friend_id INTEGER 3 2 2015-09-20 is_friend_since DATE 2 3 2015-09-20 Data 51

Case Study How do you get a list of mutual friends of two given users (say user 2 and user 3)? Retrieve the lists of friends of these two users, and then find the overlap of these two lists in your application code Perform a complex SQL query by joining the friendship table with itself and let the database return the list of mutual friends It would not be efficient to compute this list on-the-fly. It is also likely that this list is not going to be changed very frequently. 52

Case Study How can we improve the efficient of this function using asynchronous tasks? User 1 adds User 2 as a new friend Submit message to queue RabbitMQ Message delivers to workers Worker Worker updates the database with the new friendship Response (successful) Request a list of mutual friends Respond with a list of mutual friends Server Application Server application retrieves the list of mutual friends from Redis Redis Worker generates a list of mutual friends and store the list in Redis (e.g. using the key 1:2 MySQL Database 53

Pay Attention when using Message Queues Use asynchronous tasks if the action to be taken is more time or resource consuming than sending a message to the broker Make sure the workers consume messages faster than the producers generating messages Consider the importance of the messages, and use acknowledgements whenever necessary 54

End of Lecture 9 55