architecting with queues for scale, speed, and separation (dcphp 3/11/15)

27
Architecting with Queues for Scale, Speed and Separation Sandy Smith DCPHP 3/11/15

Upload: sandy-smith

Post on 14-Jul-2015

205 views

Category:

Software


1 download

TRANSCRIPT

Architecting with Queues for Scale, Speed and Separation

Sandy Smith DCPHP 3/11/15

Architecting with Queues - Sandy Smith - DCPHP - 3/11/15

The Challenge

2

Architecting with Queues - Sandy Smith - DCPHP - 3/11/15

Social Contest

•Show off Azure + PHP •People submit tweets to enter contest •Pull specified keywords from Twitter queue (prefiltered by Node.js app) •Human admins filter out inappropriate content •Humans or computer pulls out winner from approved entries, on timer or arbitrarily •Display latest entries and latest winners to public

3

Architecting with Queues - Sandy Smith - DCPHP - 3/11/15

Stretch goals

•Allow any size contest •Assume global contest with distributed moderators

4

Architecting with Queues - Sandy Smith - DCPHP - 3/11/15

Initial design

5

Architecting with Queues - Sandy Smith - DCPHP - 3/11/15

The real bottleneck

What’s the slowest and most variable part of any application?

6

Insert Text Here

Architecting with Queues - Sandy Smith - DCPHP - 3/11/15

The real bottleneck

7

Architecting with Queues - Sandy Smith - DCPHP - 3/11/15

Quick refresherPerformance vs. ScalingVertical vs. Horizontal Scaling

8

Architecting with Queues - Sandy Smith - DCPHP - 3/11/15

Traditional database design

•Group by kind •Keep metadata with object or in metadata tables •Objects (Document, Person, Account) are most important •Reinforced by TableGateway, ActiveRecord patterns, and ORM and framework module generator defaults •Works for 80% of cases

9

Architecting with Queues - Sandy Smith - DCPHP - 3/11/15

Tradeoffs of traditional design

•Everything’s in one table, even when you routinely only need a subset •Typically one master writes, replicants read •Design is focused around what something is, not its state or other attribute •Requires creative solutions for horizontal scaling •Encourages (but does not require) centralizing logic for a given type of data

10

Architecting with Queues - Sandy Smith - DCPHP - 3/11/15

Worst of all…

•This design really didn’t show off all the stuff in Azure

11

(We had a week left)

Architecting with Queues - Sandy Smith - DCPHP - 3/11/15

Redesign time

12

Architecting with Queues - Sandy Smith - DCPHP - 3/11/15

Redesign goals

• Include as much Azure stuff as is reasonable • Implement the stretch goals of scalability

13

Architecting with Queues - Sandy Smith - DCPHP - 3/11/15

Queues to the rescue!(Plus some other cool stuff)

14

Architecting with Queues - Sandy Smith - DCPHP - 3/11/15

New approach

•Keep long term but fast storage •Central concern is not the Thing (Entry) but Status

– Unapproved– Approved– Denied– Winner

•Separate updates to long term storage from status changes •Minimal impact to working code

15

Architecting with Queues - Sandy Smith - DCPHP - 3/11/15

Azure queuing options

Azure Queues (duh) •Simple •“Short”-lived (<7 days) •Used within Azure •Uses REST •Can track message processing

16

Azure Service Bus •Enterprisey •Long-lived • In Azure or private cloud •Can use AMQP, REST, or API •Can publish/subscribe •Can batch requests •Can guarantee FIFO •etc.

See https://msdn.microsoft.com/en-us/library/azure/hh767287.aspx

Architecting with Queues - Sandy Smith - DCPHP - 3/11/15

More options

•Anything you can install on Linux or Windows (RabbitMQ, ZeroMQ, Kafka, Kestrel, ActiveMQ, etc.) •Any relational or NoSQL database •Azure Tables - Simple REST NoSQL store with a twist

17

Architecting with Queues - Sandy Smith - DCPHP - 3/11/15

Solutions

•Long term storage and display retrieval: Azure Table •Since entries could begin long before a conference, use Service Bus to store changes in status •Have daemons pull incoming status changes out and write them to the Table

18

Architecting with Queues - Sandy Smith - DCPHP - 3/11/15

New design

19

Architecting with Queues - Sandy Smith - DCPHP - 3/11/15

Azure Table basics

20

require_once 'vendor\autoload.php'; use WindowsAzure\Common\ServicesBuilder; use WindowsAzure\Common\ServiceException; use WindowsAzure\Table\Models\Entity; use WindowsAzure\Table\Models\EdmType; // Create table REST proxy. $tableRestProxy = ServicesBuilder::getInstance()->createTableService($connectionString); try { // Create table. $tableRestProxy->createTable("mytable"); } catch(ServiceException $e){ // Handle exception based on error codes and messages.} $entity = new Entity(); $entity->setPartitionKey("pk"); $entity->setRowKey("1"); $entity->addProperty("PropertyName", EdmType::STRING, "Sample"); try { $tableRestProxy->insertEntity("mytable", $entity); } catch(ServiceException $e){ // Handle exception based on error codes and messages.}

Architecting with Queues - Sandy Smith - DCPHP - 3/11/15

Create and send with Service Bus

21

require_once 'vendor\autoload.php'; use WindowsAzure\ServiceBus\Models\QueueInfo; use WindowsAzure\Common\ServiceException; use WindowsAzure\Common\ServicesBuilder; $serviceBusRestProxy = ServicesBuilder::getInstance()->createServiceBusService($connectionString); try { $queueInfo = new QueueInfo("myqueue"); $serviceBusRestProxy->createQueue($queueInfo); } catch(ServiceException $e) { // handle error } try { // Create message. $message = new BrokeredMessage(); $message->setBody("my message"); // Send message. $serviceBusRestProxy->sendQueueMessage("myqueue", $message); } catch(ServiceException $e) { // handle error }

Architecting with Queues - Sandy Smith - DCPHP - 3/11/15

Receive with Service Bus

22

require_once 'vendor\autoload.php'; use WindowsAzure\ServiceBus\Models\QueueInfo; use WindowsAzure\Common\ServiceException; use WindowsAzure\Common\ServicesBuilder; $serviceBusRestProxy = ServicesBuilder::getInstance()->createServiceBusService($connectionString); try { // Set the receive mode to PeekLock (default is ReceiveAndDelete). $options = new ReceiveMessageOptions(); $options->setPeekLock(true); // Receive message. $message = $serviceBusRestProxy->receiveQueueMessage("myqueue", $options); echo "Body: ".$message->getBody()."<br />"; echo "MessageID: ".$message->getMessageId()."<br />"; // *** Process message here *** // Delete message. $serviceBusRestProxy->deleteMessage($message); } catch(ServiceException $e){ // handle error }

Architecting with Queues - Sandy Smith - DCPHP - 3/11/15

Benefits

•Queues add safety: if processing fails, main store is unchanged •App doesn’t wait for process-update-delete cycle

– Concerns more separated•Can move queue processing to separate machines •Trivial to move to different stores for each status •Very performant with up-to-second data

23

Architecting with Queues - Sandy Smith - DCPHP - 3/11/15

Challenges

•No full ACID •Safety is largely in the application layer •Potential for race conditions

– Humans suck

24

Architecting with Queues - Sandy Smith - DCPHP - 3/11/15

Takeaways

•Look for more than just long processes •Use to decouple functions •Look for status changes • Is the type of data the most important aspect of your data?

– It usually is!•Design for replacement of components

– Makes changes easier (not easy)

25

Architecting with Queues - Sandy Smith - DCPHP - 3/11/15

Links

•Azure: http://azure.microsoft.com/en-us/ •Social Contest:https://github.com/MusketeersMe/SocialContest •Me

– @SandyS1– http://phparch.com/

•Feedback! https://joind.in/event/dc-php-march-2015 •Lone Star PHP (April 16–18): http://lonestarphp.com •php[tek] (May 18–22) http://tek.phparch.com •Slides will be at: http://www.slideshare.net/SandySmith

26

Architecting with Queues - Sandy Smith - DCPHP - 3/11/15

Image credits

•Questions? by Valerie Everetthttps://flic.kr/p/5zEjFG •Expanded coke zero can! by Audin Malminhttps://flic.kr/p/5Ldjx8

27