SlideShare a Scribd company logo
@asgrim
Get started with RabbitMQ
James Titcumb
CoderCruise 2017
$ whoami
James Titcumb
www.jamestitcumb.com
www.roave.com
@asgrim
Get Started with RabbitMQ (CoderCruise 2017)
@asgrim
What is a message?
@asgrim
What is message queueing?
@asgrim
Separation of Concerns
@asgrim
Scaling with Rabbit
RabbitMQApplication
Background processing
@asgrim
Scaling with Rabbit
RabbitMQApplication
Background processing
Background processing
@asgrim
Scaling with Rabbit
RabbitMQApplication
Background processing
Background processing
Background processing
@asgrim
Scaling with Rabbit
RabbitMQApplication
Background processing
Background processing
Background processing
Background processing
@asgrim
Scaling with Rabbit
RabbitMQApplication
Background processing
Background processing
Background processing
Background processing
Background processing
@asgrim
AMQP
@asgrim
AMQP Low Level Frame
1 1 67 <frame payload> 0xCE
@asgrim
AMQP Frame: Basic.Publish
<frame payload>
Publish <exchange> <routing key> <flag>
1 1 67 0xCE
Basic
@asgrim
AMQP Message: Multiple Frames
1 1 67 Basic.Publish 0xCE
2 1 102 Content Header 0xCE
3 1 1024 Body 0xCE
3 1 1024 Body 0xCE
3 1 1024 Body 0xCE
3 1 1024 Body 0xCE
@asgrim
AMQP Headers
● content-type
@asgrim
AMQP Headers
● content-type
● content-encoding
@asgrim
AMQP Headers
● content-type
● content-encoding
● message-id
@asgrim
AMQP Headers
● content-type
● content-encoding
● message-id
● correlation-id
● reply-to
@asgrim
AMQP Headers
● content-type
● content-encoding
● message-id
● correlation-id
● reply-to
● expiration
@asgrim
AMQP Headers
● content-type
● content-encoding
● message-id
● correlation-id
● reply-to
● expiration
● priority
@asgrim
AMQP Headers
● content-type
● content-encoding
● message-id
● correlation-id
● reply-to
● expiration
● priority
● headers
@asgrim
Real world uses?
@asgrim
SOA
@asgrim
Why RabbitMQ?
@asgrim
https://github.com/asgrim/rmq-slides
Follow along here...
@asgrim
(on trusty64 Vagrant, other OSs may vary)
Installing RabbitMQ
@asgrim
● add apt repo
○ deb http://www.rabbitmq.com/debian/ testing main
● add signing key
○ https://www.rabbitmq.com/rabbitmq-release-signing-key.asc
● apt-get update
● apt-get install rabbitmq-server
● rabbitmq-plugins enable rabbitmq_management
● sudo service rabbitmq-server restart
Using Apt
@asgrim
http://localhost:15672/
@asgrim
http://localhost:15672/
@asgrim
http://localhost:15672/
@asgrim
http://localhost:15672/
@asgrim
http://localhost:15672/
@asgrim
Basic Message Queue
@asgrim
Objective: Basic Queuing
Producer Consumer
test_queue
1 2 3 4 5
@asgrim
composer.json
composer require php-amqplib/php-amqplib
@asgrim
Please wait, connecting...
1 use PhpAmqpLibConnectionAMQPConnection;
2
3 $connection = new AMQPConnection(
4 'localhost', 5672, 'guest', 'guest', '/');
5
6 $channel = $connection->channel();
@asgrim
basic/producer.php
1 use PhpAmqpLibMessageAMQPMessage;
2
3 $channel->queue_declare(
4 'test_queue', false, true, false, false);
5
6 $message = new AMQPMessage('my test message');
7 $channel->basic_publish($message, '', 'test_queue');
@asgrim
basic/consumer.php
1 $channel->basic_consume(
2 'test_queue', '', false, true, false, false,
3 function(AMQPMessage $message) {
4 echo $message->body . "n";
5 });
6
7 while (count($channel->callbacks))
8 $channel->wait();
@asgrim
What to expect...
@asgrim
Exchanges: Fanout
@asgrim
Objective: Fanout Exchange
test_exchange
amq.KfgPZ3PE
amq.cK5Cp3FC
Consumer
Consumer
Producer
1
1
2
2
3
3
4
4
5
5
@asgrim
fanout/producer.php
1 use PhpAmqpLibMessageAMQPMessage;
2
3 $channel->exchange_declare(
4 'test_exchange', 'fanout', false, false, false);
5
6 $message = new AMQPMessage('test msg #' . $id);
7 $channel->basic_publish($message, 'test_exchange');
@asgrim
fanout/consumer.php
1 $q = $channel->queue_declare(
2 '', false, false, false, true);
3 $queue_name = $q[0];
4
5 $channel->exchange_declare(
6 'test_exchange', 'fanout', false, false, false);
7 $channel->queue_bind($queue_name, 'test_exchange');
@asgrim
What to expect...
@asgrim
A word on Temporary Queues
test_exchangeProducer
Messages
go nowhere
@asgrim
Exchanges: Direct
@asgrim
Objective: Direct Exchange
test_direct
BK = apple
BK = banana, apple
Consumer
Consumer
Producer
BK = orange, banana,
apple
Consumer
@asgrim
Objective: Direct Exchange
test_direct
BK = apple
BK = banana, apple
Consumer
Consumer
Producer
MESSAGE
ROUTING KEY
= ORANGE
BK = orange, banana,
apple
Consumer
@asgrim
Objective: Direct Exchange
test_direct
BK = apple
BK = banana, apple
Consumer
Consumer
Producer
MESSAGE
ROUTING KEY
= BANANA
BK = orange, banana,
apple
Consumer
@asgrim
Objective: Direct Exchange
test_direct
BK = apple
BK = banana, apple
Consumer
Consumer
Producer
MESSAGE
ROUTING KEY
= APPLE
BK = orange, banana,
apple
Consumer
@asgrim
direct/producer.php
1 $channel->exchange_declare(
2 'test_direct', 'fanout', false, false, false);
3
4 $messageContent = 'test msg, key=' . $routingKey;
5 $message = new AMQPMessage($messageContent);
6 $channel->basic_publish(
7 $message, 'test_direct', $routingKey);
@asgrim
direct/consumer.php
1 $q = $channel->queue_declare('', false, false, false, true);
2 $queue_name = $q[0];
3 $channel->exchange_declare(
4 'test_direct', 'direct', false, false, false);
5
6 // Bind for each routing key we want (BINDING KEY)
7 $channel->queue_bind($queue_name, 'test_direct', 'apple');
8 $channel->queue_bind($queue_name, 'test_direct', 'orange');
9 $channel->queue_bind($queue_name, 'test_direct', 'banana');
@asgrim
What to expect...
@asgrim
Exchanges: Topic
@asgrim
Objective:
Topic Exchange
test_topic
BK = *.vegetable
BK = #
Consumer
Consumer
Producer
BK = green.#
Consumer
BK = *.grass.* / *.*.long
Consumer
@asgrim
Objective:
Topic Exchange
test_topic
BK = *.vegetable
BK = #
Consumer
Consumer
Producer
RED.VEGETABLE
BK = green.#
Consumer
BK = *.grass.* / *.*.long
Consumer
@asgrim
Objective:
Topic Exchange
test_topic
BK = *.vegetable
BK = #
Consumer
Consumer
Producer
GREEN.VEGETABLE
BK = green.#
Consumer
BK = *.grass.* / *.*.long
Consumer
@asgrim
Objective:
Topic Exchange
test_topic
BK = *.vegetable
BK = #
Consumer
Consumer
Producer
GREEN.GRASS.LONG
BK = green.#
Consumer
BK = *.grass.* / *.*.long
Consumer
@asgrim
Real World Example
Get Started with RabbitMQ (CoderCruise 2017)
@asgrim
Fetch message
Logging Sequence
ApplicationBrowser Log Server
HTTP request
JSON via AMQP
Error!
HTTP response
RabbitMQ
@asgrim
Flexibility!
@asgrim
Parallel Processing
@asgrim
test_exchange
amq.KfgPZ3PE
amq.cK5Cp3FC
Consumer
Producer
1
1
2
2
3
3
4
4
5
5
Consumer
Consumer
Consumer
Consumer
Consumer
Consumer
Consumer
Parallel Processing
@asgrim
Message Acknowledgement
@asgrim
Message Acknowledgement
1 $channel->basic_consume(
2 'test_queue', '', false, false, false, false,
3 function(AMQPMessage $message) {
4 echo $message->body . "n";
5 throw new Exception('oh noes!!!');
6
7 $channel = $message->delivery_info['channel'];
8 $tag = $message->delivery_info['delivery_tag'];
9 $channel->basic_ack($tag);
10 });
@asgrim
RPC
@asgrim
RPC example
Producer Consumer
test_queue
1
reply_to: amq.gen-Xa2
1’
@asgrim
TTL
@asgrim
TTL - per queue message
Producer Consumer
test_queue
1 2 3 4 5
}
10s
@asgrim
TTL - per message
Producer Consumer
test_queue
1 2 3 4 5
5s 3s 7s 1s 9s
@asgrim
TTL - queue
Producer
test_queue
}
5s (if no consumers)
@asgrim
DLX
@asgrim
DLX
test_exchange
amq.KfgPZ3PE
Producer 1
dlx_exchange
dlx_queue
1
@asgrim
Scheduling / Delayed messages
@asgrim
Priority
@asgrim
http://tryrabbitmq.com/
@asgrim
Infrastructure
@asgrim
Problem: SPOF
@asgrim
Solution 1: Clustering
@asgrim
Clustering
RabbitMQ
Node 1
RabbitMQ
Node 3
RabbitMQ
Node 2
RabbitMQ
Node 4
RabbitMQ
Node 5
RabbitMQ
Node 6
Load Balance / Floating IP / Low TTL DNS etc.
@asgrim
Everything Replicates
(except queues…)
@asgrim
Disk / RAM
@asgrim
Configuration...
@asgrim
/etc/rabbitmq/rabbitmq.config
[
{rabbit, [
{loopback_users, []},
{vm_memory_high_watermark, 0.8}
]}
].
@asgrim
/etc/rabbitmq/rabbitmq.config
[{{{[{{[{{}}{][[[{[{{}[[}{[[{}[][}{}}}{}}{{,},]{
[[{rabbit, [{{}[[}{,,{}[][}{[][][{}{{{{}}}}[[}{{
{{}}{loopback_users, []},[][][]{}{}{}<}{[}[][][}
[{{[{vm_memory_high_watermark, 0.8}]]{}{[[[]]{}]
{{]}[{[{{}[[}{]]{}[][,{}[][}{[][][{}.[]}{]][][]}
]...{}[][,]{.}[][}{}[[[{}{][]}{}{}[}{}{}{]{}{}}[
@asgrim
Creating a cluster
node1$ rabbitmqctl cluster_status
Cluster status of node rabbit@node1 ...
[{nodes,[{disc,[rabbit@node1]}]},{running_nodes,[rabbit@node1]}]
...done.
@asgrim
Creating a cluster
node2$ rabbitmqctl join_cluster --ram rabbit@node1
node3$ rabbitmqctl join_cluster rabbit@node2
node3$ rabbitmqctl cluster_status
Cluster status of node rabbit@node3 ...
[{nodes,[{disc,[rabbit@node3,rabbit@node1]},{ram,[rabbit@node2]}]},
{running_nodes,[rabbit@node2,rabbit@node1,rabbit@node3]}]
...done.
@asgrim
Starting/Stopping Nodes
@asgrim
Removing Nodes
node1$ rabbitmqctl stop_app
node2$ rabbitmqctl forget_cluster_node rabbit@node1
node1$ rabbitmqctl reset
node1$ rabbitmqctl start_app
node2$ rabbitmqctl cluster_status
Cluster status of node rabbit@node2 ...
[{nodes,[{disc,[rabbit@node3]},{ram,[rabbit@node2]}]},
{running_nodes,[rabbit@node2,rabbit@node3]}]
...done.
@asgrim
Solution 2: HA
@asgrim
HA + Queue Mirroring
RabbitMQ
Node 1
RabbitMQ
Node 2
Load Balance / Floating IP / Low TTL DNS etc.
@asgrim
https://github.com/asgrim/rmq-slides
That link again...
Any questions?
James Titcumb
@asgrim

More Related Content

What's hot (20)

ODP
Exploiting the newer perl to improve your plugins
Marian Marinov
 
PDF
Code obfuscation, php shells & more
Mattias Geniar
 
KEY
Perl: Hate it for the Right Reasons
Matt Follett
 
PDF
AnyMQ, Hippie, and the real-time web
clkao
 
KEY
FizzBuzzではじめるテスト
Masashi Shinbara
 
PDF
Questioning the status quo
Ivano Pagano
 
PDF
Two scoops of Django - Security Best Practices
Spin Lai
 
PPTX
Let's write secure Drupal code! - DrupalCamp Belarus 2019
Balázs Tatár
 
PDF
Php web backdoor obfuscation
Sandro Zaccarini
 
PPTX
非同期処理の通知処理 with Tatsumaki
keroyonn
 
KEY
Operation Oriented Web Applications / Yokohama pm7
Masahiro Nagano
 
PPTX
An introduction to Raku
Simon Proctor
 
PDF
Let's play a game with blackfire player
Marcin Czarnecki
 
PPTX
Security in PHP - 那些在滲透測試的小技巧
Orange Tsai
 
PDF
Practical django secuirty
Andy Dai
 
PDF
HTTP For the Good or the Bad - FSEC Edition
Xavier Mertens
 
PDF
PHP Backdoor: The rise of the vuln
Sandro Zaccarini
 
PDF
Top 10 php classic traps php serbia
Damien Seguy
 
PDF
Dip Your Toes in the Sea of Security (PHP Berkshire Nov 2015)
James Titcumb
 
PPT
Triple Blitz Strike
Denis Zhdanov
 
Exploiting the newer perl to improve your plugins
Marian Marinov
 
Code obfuscation, php shells & more
Mattias Geniar
 
Perl: Hate it for the Right Reasons
Matt Follett
 
AnyMQ, Hippie, and the real-time web
clkao
 
FizzBuzzではじめるテスト
Masashi Shinbara
 
Questioning the status quo
Ivano Pagano
 
Two scoops of Django - Security Best Practices
Spin Lai
 
Let's write secure Drupal code! - DrupalCamp Belarus 2019
Balázs Tatár
 
Php web backdoor obfuscation
Sandro Zaccarini
 
非同期処理の通知処理 with Tatsumaki
keroyonn
 
Operation Oriented Web Applications / Yokohama pm7
Masahiro Nagano
 
An introduction to Raku
Simon Proctor
 
Let's play a game with blackfire player
Marcin Czarnecki
 
Security in PHP - 那些在滲透測試的小技巧
Orange Tsai
 
Practical django secuirty
Andy Dai
 
HTTP For the Good or the Bad - FSEC Edition
Xavier Mertens
 
PHP Backdoor: The rise of the vuln
Sandro Zaccarini
 
Top 10 php classic traps php serbia
Damien Seguy
 
Dip Your Toes in the Sea of Security (PHP Berkshire Nov 2015)
James Titcumb
 
Triple Blitz Strike
Denis Zhdanov
 

Similar to Get Started with RabbitMQ (CoderCruise 2017) (20)

PDF
Adding 1.21 Gigawatts to Applications with RabbitMQ (DPC 2015)
James Titcumb
 
PDF
Adding 1.21 Gigawatts to Applications with RabbitMQ (PHPNW Dec 2014 Meetup)
James Titcumb
 
PDF
What RabbitMQ can do for you (phpnw14 Uncon)
James Titcumb
 
PDF
Adding 1.21 Gigawatts to Applications with RabbitMQ (PHP UK 2015)
James Titcumb
 
PDF
Practical Message Queueing using RabbitMQ (Nomad PHP EU Dec 2014)
James Titcumb
 
PDF
Practical Message Queuing Using RabbitMQ (PHPem, 3rd July 2014)
James Titcumb
 
PDF
Best practices for crafting high quality PHP apps (ScotlandPHP 2018)
James Titcumb
 
PDF
Adding 1.21 Gigawatts to Applications with RabbitMQ (Bulgaria PHP 2016 - Tuto...
James Titcumb
 
PDF
Best practices for crafting high quality PHP apps (PHP South Africa 2018)
James Titcumb
 
PDF
Best practices for crafting high quality PHP apps - PHP UK 2019
James Titcumb
 
PDF
Best practices for crafting high quality PHP apps (PHP Yorkshire 2018)
James Titcumb
 
PDF
RabbitMQ for Perl mongers
Lenz Gschwendtner
 
PDF
Lightweight Webservices with Sinatra and RestClient
Adam Wiggins
 
PDF
Crafting Quality PHP Applications: an overview (PHPSW March 2018)
James Titcumb
 
PDF
PHP, RabbitMQ, and You
Jason Lotito
 
KEY
Groovy DSLs, from Beginner to Expert - Guillaume Laforge and Paul King - Spri...
Guillaume Laforge
 
PDF
Crafting Quality PHP Applications (Bucharest Tech Week 2017)
James Titcumb
 
PDF
Crafting Quality PHP Applications (PHPkonf 2018)
James Titcumb
 
PDF
Crafting Quality PHP Applications (PHP Benelux 2018)
James Titcumb
 
PDF
Crafting Quality PHP Applications (ConFoo YVR 2017)
James Titcumb
 
Adding 1.21 Gigawatts to Applications with RabbitMQ (DPC 2015)
James Titcumb
 
Adding 1.21 Gigawatts to Applications with RabbitMQ (PHPNW Dec 2014 Meetup)
James Titcumb
 
What RabbitMQ can do for you (phpnw14 Uncon)
James Titcumb
 
Adding 1.21 Gigawatts to Applications with RabbitMQ (PHP UK 2015)
James Titcumb
 
Practical Message Queueing using RabbitMQ (Nomad PHP EU Dec 2014)
James Titcumb
 
Practical Message Queuing Using RabbitMQ (PHPem, 3rd July 2014)
James Titcumb
 
Best practices for crafting high quality PHP apps (ScotlandPHP 2018)
James Titcumb
 
Adding 1.21 Gigawatts to Applications with RabbitMQ (Bulgaria PHP 2016 - Tuto...
James Titcumb
 
Best practices for crafting high quality PHP apps (PHP South Africa 2018)
James Titcumb
 
Best practices for crafting high quality PHP apps - PHP UK 2019
James Titcumb
 
Best practices for crafting high quality PHP apps (PHP Yorkshire 2018)
James Titcumb
 
RabbitMQ for Perl mongers
Lenz Gschwendtner
 
Lightweight Webservices with Sinatra and RestClient
Adam Wiggins
 
Crafting Quality PHP Applications: an overview (PHPSW March 2018)
James Titcumb
 
PHP, RabbitMQ, and You
Jason Lotito
 
Groovy DSLs, from Beginner to Expert - Guillaume Laforge and Paul King - Spri...
Guillaume Laforge
 
Crafting Quality PHP Applications (Bucharest Tech Week 2017)
James Titcumb
 
Crafting Quality PHP Applications (PHPkonf 2018)
James Titcumb
 
Crafting Quality PHP Applications (PHP Benelux 2018)
James Titcumb
 
Crafting Quality PHP Applications (ConFoo YVR 2017)
James Titcumb
 
Ad

More from James Titcumb (19)

PDF
Living the Best Life on a Legacy Project (phpday 2022).pdf
James Titcumb
 
PDF
Tips for Tackling a Legacy Codebase (ScotlandPHP 2021)
James Titcumb
 
PDF
Climbing the Abstract Syntax Tree (Midwest PHP 2020)
James Titcumb
 
PDF
Best practices for crafting high quality PHP apps (Bulgaria 2019)
James Titcumb
 
PDF
Climbing the Abstract Syntax Tree (php[world] 2019)
James Titcumb
 
PDF
Best practices for crafting high quality PHP apps (php[world] 2019)
James Titcumb
 
PDF
Crafting Quality PHP Applications (PHP Joburg Oct 2019)
James Titcumb
 
PDF
Climbing the Abstract Syntax Tree (PHP Russia 2019)
James Titcumb
 
PDF
Climbing the Abstract Syntax Tree (ScotlandPHP 2018)
James Titcumb
 
PDF
Kicking off with Zend Expressive and Doctrine ORM (PHP South Africa 2018)
James Titcumb
 
PDF
Climbing the Abstract Syntax Tree (PHP Developer Days Dresden 2018)
James Titcumb
 
PDF
Climbing the Abstract Syntax Tree (Southeast PHP 2018)
James Titcumb
 
PDF
Kicking off with Zend Expressive and Doctrine ORM (PHP MiNDS March 2018)
James Titcumb
 
PDF
Climbing the Abstract Syntax Tree (PHP UK 2018)
James Titcumb
 
PDF
Dip Your Toes in the Sea of Security (ConFoo YVR 2017)
James Titcumb
 
PDF
Kicking off with Zend Expressive and Doctrine ORM (ConFoo YVR 2017)
James Titcumb
 
PDF
Climbing the Abstract Syntax Tree (Forum PHP 2017)
James Titcumb
 
PDF
Dip Your Toes in the Sea of Security (IPC Fall 2017)
James Titcumb
 
PDF
Climbing the Abstract Syntax Tree (IPC Fall 2017)
James Titcumb
 
Living the Best Life on a Legacy Project (phpday 2022).pdf
James Titcumb
 
Tips for Tackling a Legacy Codebase (ScotlandPHP 2021)
James Titcumb
 
Climbing the Abstract Syntax Tree (Midwest PHP 2020)
James Titcumb
 
Best practices for crafting high quality PHP apps (Bulgaria 2019)
James Titcumb
 
Climbing the Abstract Syntax Tree (php[world] 2019)
James Titcumb
 
Best practices for crafting high quality PHP apps (php[world] 2019)
James Titcumb
 
Crafting Quality PHP Applications (PHP Joburg Oct 2019)
James Titcumb
 
Climbing the Abstract Syntax Tree (PHP Russia 2019)
James Titcumb
 
Climbing the Abstract Syntax Tree (ScotlandPHP 2018)
James Titcumb
 
Kicking off with Zend Expressive and Doctrine ORM (PHP South Africa 2018)
James Titcumb
 
Climbing the Abstract Syntax Tree (PHP Developer Days Dresden 2018)
James Titcumb
 
Climbing the Abstract Syntax Tree (Southeast PHP 2018)
James Titcumb
 
Kicking off with Zend Expressive and Doctrine ORM (PHP MiNDS March 2018)
James Titcumb
 
Climbing the Abstract Syntax Tree (PHP UK 2018)
James Titcumb
 
Dip Your Toes in the Sea of Security (ConFoo YVR 2017)
James Titcumb
 
Kicking off with Zend Expressive and Doctrine ORM (ConFoo YVR 2017)
James Titcumb
 
Climbing the Abstract Syntax Tree (Forum PHP 2017)
James Titcumb
 
Dip Your Toes in the Sea of Security (IPC Fall 2017)
James Titcumb
 
Climbing the Abstract Syntax Tree (IPC Fall 2017)
James Titcumb
 
Ad

Recently uploaded (20)

PDF
CIFDAQ Market Insights for July 7th 2025
CIFDAQ
 
PPTX
AUTOMATION AND ROBOTICS IN PHARMA INDUSTRY.pptx
sameeraaabegumm
 
PDF
CIFDAQ Token Spotlight for 9th July 2025
CIFDAQ
 
PDF
How Startups Are Growing Faster with App Developers in Australia.pdf
India App Developer
 
PDF
“NPU IP Hardware Shaped Through Software and Use-case Analysis,” a Presentati...
Edge AI and Vision Alliance
 
PDF
Exolore The Essential AI Tools in 2025.pdf
Srinivasan M
 
PPTX
COMPARISON OF RASTER ANALYSIS TOOLS OF QGIS AND ARCGIS
Sharanya Sarkar
 
PDF
Using FME to Develop Self-Service CAD Applications for a Major UK Police Force
Safe Software
 
DOCX
Cryptography Quiz: test your knowledge of this important security concept.
Rajni Bhardwaj Grover
 
DOCX
Python coding for beginners !! Start now!#
Rajni Bhardwaj Grover
 
PDF
[Newgen] NewgenONE Marvin Brochure 1.pdf
darshakparmar
 
PDF
What Makes Contify’s News API Stand Out: Key Features at a Glance
Contify
 
PDF
July Patch Tuesday
Ivanti
 
PDF
LOOPS in C Programming Language - Technology
RishabhDwivedi43
 
PDF
Transcript: New from BookNet Canada for 2025: BNC BiblioShare - Tech Forum 2025
BookNet Canada
 
PDF
DevBcn - Building 10x Organizations Using Modern Productivity Metrics
Justin Reock
 
PDF
Newgen 2022-Forrester Newgen TEI_13 05 2022-The-Total-Economic-Impact-Newgen-...
darshakparmar
 
PPTX
Building Search Using OpenSearch: Limitations and Workarounds
Sease
 
PDF
The Rise of AI and IoT in Mobile App Tech.pdf
IMG Global Infotech
 
PDF
Jak MŚP w Europie Środkowo-Wschodniej odnajdują się w świecie AI
dominikamizerska1
 
CIFDAQ Market Insights for July 7th 2025
CIFDAQ
 
AUTOMATION AND ROBOTICS IN PHARMA INDUSTRY.pptx
sameeraaabegumm
 
CIFDAQ Token Spotlight for 9th July 2025
CIFDAQ
 
How Startups Are Growing Faster with App Developers in Australia.pdf
India App Developer
 
“NPU IP Hardware Shaped Through Software and Use-case Analysis,” a Presentati...
Edge AI and Vision Alliance
 
Exolore The Essential AI Tools in 2025.pdf
Srinivasan M
 
COMPARISON OF RASTER ANALYSIS TOOLS OF QGIS AND ARCGIS
Sharanya Sarkar
 
Using FME to Develop Self-Service CAD Applications for a Major UK Police Force
Safe Software
 
Cryptography Quiz: test your knowledge of this important security concept.
Rajni Bhardwaj Grover
 
Python coding for beginners !! Start now!#
Rajni Bhardwaj Grover
 
[Newgen] NewgenONE Marvin Brochure 1.pdf
darshakparmar
 
What Makes Contify’s News API Stand Out: Key Features at a Glance
Contify
 
July Patch Tuesday
Ivanti
 
LOOPS in C Programming Language - Technology
RishabhDwivedi43
 
Transcript: New from BookNet Canada for 2025: BNC BiblioShare - Tech Forum 2025
BookNet Canada
 
DevBcn - Building 10x Organizations Using Modern Productivity Metrics
Justin Reock
 
Newgen 2022-Forrester Newgen TEI_13 05 2022-The-Total-Economic-Impact-Newgen-...
darshakparmar
 
Building Search Using OpenSearch: Limitations and Workarounds
Sease
 
The Rise of AI and IoT in Mobile App Tech.pdf
IMG Global Infotech
 
Jak MŚP w Europie Środkowo-Wschodniej odnajdują się w świecie AI
dominikamizerska1
 

Get Started with RabbitMQ (CoderCruise 2017)