ITB 2023 - Faster Apps That Won’t Get Crushed - Brian Klaas.pdf

ortussolutions 12 views 43 slides Aug 28, 2024
Slide 1
Slide 1 of 96
Slide 1
1
Slide 2
2
Slide 3
3
Slide 4
4
Slide 5
5
Slide 6
6
Slide 7
7
Slide 8
8
Slide 9
9
Slide 10
10
Slide 11
11
Slide 12
12
Slide 13
13
Slide 14
14
Slide 15
15
Slide 16
16
Slide 17
17
Slide 18
18
Slide 19
19
Slide 20
20
Slide 21
21
Slide 22
22
Slide 23
23
Slide 24
24
Slide 25
25
Slide 26
26
Slide 27
27
Slide 28
28
Slide 29
29
Slide 30
30
Slide 31
31
Slide 32
32
Slide 33
33
Slide 34
34
Slide 35
35
Slide 36
36
Slide 37
37
Slide 38
38
Slide 39
39
Slide 40
40
Slide 41
41
Slide 42
42
Slide 43
43
Slide 44
44
Slide 45
45
Slide 46
46
Slide 47
47
Slide 48
48
Slide 49
49
Slide 50
50
Slide 51
51
Slide 52
52
Slide 53
53
Slide 54
54
Slide 55
55
Slide 56
56
Slide 57
57
Slide 58
58
Slide 59
59
Slide 60
60
Slide 61
61
Slide 62
62
Slide 63
63
Slide 64
64
Slide 65
65
Slide 66
66
Slide 67
67
Slide 68
68
Slide 69
69
Slide 70
70
Slide 71
71
Slide 72
72
Slide 73
73
Slide 74
74
Slide 75
75
Slide 76
76
Slide 77
77
Slide 78
78
Slide 79
79
Slide 80
80
Slide 81
81
Slide 82
82
Slide 83
83
Slide 84
84
Slide 85
85
Slide 86
86
Slide 87
87
Slide 88
88
Slide 89
89
Slide 90
90
Slide 91
91
Slide 92
92
Slide 93
93
Slide 94
94
Slide 95
95
Slide 96
96

About This Presentation

Async messaging boosts app scalability. Traditional request/response cycles have limits. Services like SQS and SNS overcome scaling issues. These tools enable responsive CFML apps. Async processing improves performance under load.

Summary: Asynchronous messaging enhances web app scalability and res...


Slide Content

Faster Apps That Won't
Get Crushed With
Queues And Pub/Sub
Mechanisms
INTO THE BOX 2023
BRIAN KLAAS

Workflows

Workflows

Workflows
Click Button
Validate
Request
Check
Inventory
Process
Payment
Find Closest
Warehouse
Create Pick
Ticket
Calculate
Ship Date
Send
Confirmation
Email
Success
View

Workflows
Click Button
Success
View

Nothing’s faster
than work you don’t have to wait for.
Workflows

Scale and speed
are every developer’s problem.
Workflows

Faster Apps That Won't
Get Crushed With
Queues And Pub/Sub
Mechanisms
INTO THE BOX 2023
BRIAN KLAAS

Request/Response

Request/Response

We’ve got to wait around for some ill-
defined future point.
Request/Response

runAsync( ) in CFML 2018+
Request/Response

runAsync(validateRequest)
.then(checkInventory)
.then(processPayment)
.then(findClosestWarehouse)
.then(createPickTicket)
.then(calculateShipDate);
.then(sendEmailConfirmation);
Request/Response

var clientView = runAsync(validateRequest)
.then(processPayment)
.then(sendEmailConfirmation);
var warehouseProcess = runAsync(findClosestWarehouse)
.then(checkInventory)
.then(createPickTicket)
.then(calculateShipDate);
.then(sendShipmentDateEmail);
Request/Response

ColdBox asyncManager & Futures
async().newFuture( () => orderService.getOrder() )
.then( (order) => enrichOrder( order ) )
.then( (order) => performPayment( order ) )
.then( (order) => sendConfirmation( order ) );
Request/Response

Error handling
Retries
Throttling
New business requirements
Request/Response

Linear, linked flow encourages
brittle architectures
Request/Response

Linear, linked flow blocks
your ability to scale
Request/Response

How can we do better?
Request/Response

Event-driven

Something happens.
Code responds.
Event-driven

Database triggers
Event-driven
SQL

ColdBox Interceptors
Event-driven

Event–driven = automatic plumbing
Event-driven

Event-driven = easy fan-out
Event-driven

How do you know it’s done?
Event-driven
?

Orchestration tools
Event-driven

Orchestration = additional complexity
Event-driven
!

Something simpler?
Event-driven

Pub/Sub +
Queues

SNS = Simple Notification Service
Pub/Sub + Queues

SNS = Pub/Sub
Pub/Sub + Queues

SNS = One Publisher,
Many Subscribers
Pub/Sub + Queues

SNS Subscribers:
https endpoints (including CFML)
Email
Phone number (SMS)
SQS queue
Lambda
Kinesis Firehose
Pinpoint
Pub/Sub + Queues

SNS subscribers can:
Filter on specific criteria
Retry on delivery to https endpoints
Specify DLQ on completely failed delivery
Pub/Sub + Queues

var messageBody = { "createdOn": now()),
"userID": arguments.userID,
"event": arguments.thisEvent,
};

var messageBodyAsJSON = serializeJSON(messageBody);

var publishRequest = CreateObject('java',
‘com.amazonaws.services.sns.model.PublishRequest’)
.withTopicARN(variables.snsARN)
.withMessage(messageBodyAsJSON);

variables.snsService.publish(publishRequest);
Pub/Sub + Queues
github.com/brianklaas/awsplaybox

Add AWS Java SDK .jar to:
Adobe ColdFusion: cfusion/lib
Lucee: WEB-INF/lucee/lib/
ColdBox: lib/
Pub/Sub + Queues

SNS is about speed
Pub/Sub + Queues

SNS = Fan-out
Pub/Sub + Queues

SQS = Simple Queue Service
Pub/Sub + Queues

SQS = Stack of messages
Pub/Sub + Queues

SQS = One publisher,
one worker
Pub/Sub + Queues

Pub/Sub + Queues
CFML
(ack)

Pub/Sub + Queues
CFML
CFML
CFML

SQS queues can:
Perform content-based deduplication
Retry messages on failed processing
Specify DLQ on completely failed processing
Pub/Sub + Queues

SQS != ordered processing
Pub/Sub + Queues

SQS != only-once delivery
Pub/Sub + Queues

SQS reqiures idempotency
Pub/Sub + Queues

FIFO queues for order
Pub/Sub + Queues

Pub/Sub + Queues
github.com/brianklaas/awsplaybox
var messageBody = { "createdOn": now()),
"userID": arguments.userID,
"event": arguments.thisEvent,
};

var messageBodyAsJSON = serializeJSON(messageBody);

var sendMessageRequest =
createObject("java","com.amazonaws.services.sqs.model.SendMessageRequest")
.withQueueUrl(variables.sqsQueueURL)
.withMessageBody(messageBody);
variables.sqsService.sendMessage(sendMessageRequest);

var receiveMessageRequest =
CreateObject(‘java’,'com.amazonaws.services.sqs.model.
ReceiveMessageRequest').init()
.withQueueURL(variables.queueURL).withMaxNumberOfMessages(1);
var messagesArray =
variables.sqsService.receiveMessage(receiveMessageRequest).getMessages();
if (arrayLen(messagesArray)) {
var messageToProcess = messagesArray[1];
var receiptHandle = messageToProcess.getReceiptHandle();
var messageBody = deserializeJSON(messageToProcess.getBody());
// do work with the message
var deleteMessageResult =
variables.sqsService.deleteMessage(variables.queueURL,receiptHandle);
}
Pub/Sub + Queues

vs

Message Size Limit:
SNS = 256 KiB
SQS = 256 KiB
vs

Message Persistence:
SNS = No
SQS = Yes
vs

Message Ordering:
SNS = Yes
SQS = Yes, when using FIFO queues
vs

Message Filtering:
SNS = Yes
SQS = Yes
vs

Common Pattern: SNS in front of SQS
vs

Use cases:
SNS = Fan-out to multiple recipients
SQS = Queuing up work by processors
vs

SNS + SQS allow you to scale and
parallelize work safely and durably.
vs

Real-World Example 1

Example

Example

Example

Example

Example

Example

Example

Example
( numRequests * avg execution time )
seconds for scheduled task

var remainingTime = 55000;
do {
var messageProcessStartTime = getTickCount();
// get SQS message, generate and send email, delete message
var messageProcessEndTime = getTickCount();
remainingTime -= (messageProcessEndTime - messageProcessStartTime);
} while (remainingTime gt 0);
Example

Example
Processing–intensive tasks
Throttle processing of a batch of items

Real-World Example 2

Example

Example

Example

Example

Example

Example

Example

Example

Kinesis Data Firehose:
Can ingest up to 500,000 records/second
Stores records for up to 7 days
Manages writing to the destination
Can be queried in real-time with Kinesis Data Analytics
Example

Example

Example

Amazon Athena:
Query files in S3 with SQL
Store in JSON, CSV, or Parquet formats
Ad-hoc or repeated queries
Pay based on amount of data scanned
Example

Example

Example

Example

Example

Example

So how much does this cost?
Example
40 million requests = $30/month

Example

Example

Safe experimentation!
Example

Go Do!

Brian Klaas
@brian_klaas
Blog: brianklaas.net
github.com/brianklaas/awsplaybox

THANK YOU
Thanks to our sponsors