SlideShare uma empresa Scribd logo
1 de 61
Baixar para ler offline
Stream processing avec
Apache Pulsar
Bruno Bonnin
@_bruno_b_
https://bonnin.dev
Directeur Technique / Consultant @ Zenika Nantes
Pulsar, un système de messagerie distribué
Né chez Yahoo ! pour compenser certaines
limites des solutions de l’époque
Pour des apps critiques comme Yahoo Mail,
Yahoo Finance, Yahoo Sports, etc
Open sourcé en 2016
Devenu Top Level Project de la
fondation Apache en sept 2018
Premier déploiement Q2 2015
Concepts & architecture
Des producteurs,
des consommateurs,
des topics, ...
Topic 1
Producteur Consommateur
Topic 2
Topic 3
Gestion des messages
Producteurs
Stockage des messages
Bookie 1
Bookie 2
Bookie 3
Bookie 4
Consommateurs
zkServer 1 zkServer 2 zkServer 3
Broker 1
Broker 2 Broker 3
lecture
stockage
meta-données
coordination clusters
stockage
meta-données
stockage des
données
Des brokers, des bookies, ...
écriture
Apache BookKeeper
Apache Zookeeper
Bookie 1
Une architecture scalable
Broker 1
Broker 2
Bookie 2 Bookie 3 Bookie 4
Gestion des
messages
Stockage des
messages
Producteurs Consommateurs
Broker 3
Bookie 5
Topic 1
Apache BookKeeper
Système de stockage scalable,
tolérant aux pannes et à faible latence
Conçu à l’origine comme une solution pour
la haute disponibilité du NameNode de
HDFS (WAL : Write-Ahead Logging)
Avec Pulsar: stockage des données et des
offsets (cursors)
Broker
Topic 1
segment 2segment 1 segment x...
Bookie 1
segment 1
Une architecture hautement disponible
segment 1 segment 1
segment x
segment x
segment 2
segment 2
Bookie 2 Bookie 3
Un topic est constitué d’un
ensemble de segments (ledgers)
contenant les messages.
Les segments sont stockés et
répartis sur les bookies.segment x
segment 2
Bookie 4
Broker
Topic 1
segment 2segment 1 segment x...
Bookie 1
segment 1
Une architecture hautement disponible
segment 1 segment 1
segment x
segment x
segment 2
segment 2
Bookie 2 Bookie 3
Sur défection d’un bookie,
automatiquement, récupération des
segments manquants pour
respecter le facteur de réplication
segment x
segment 2
Bookie 4
segment x segment 1
Modes de
consommation
TopicProducteur Consommateur - A1
Exclusive subscription
Subscription A
Consommateur - A2Les tentatives de connexions de A2
échoueront
Topics et abonnements
TopicProducteur Consommateur - B1
Fail-over subscription
Subscription B
Consommateur - B2
Messages consommés par B2,
uniquement en cas d’échec de B1
Topics et abonnements
TopicProducteur Consommateur - C1Subscription C
Consommateur - C2
Les messages sont envoyés aux deux consommateurs
(round robin) -> aucune garantie d’ordre !
Topics et abonnements
Shared subscription
TopicProducteur
Consommateur - B1
Consommateur - B2
Consommateur - A1
Consommateur - C1
Consommateur - C2
Exclusive
Subscription
Il peut y avoir plusieurs
abonnements sur un topic
Fail-over
Subscription
Shared
Subscription
Topics et abonnements
Les messages
Messages
Contenu d’un message:
- Tableau d’octets (peut être conforme à un schéma)
- Clé (optionnel)
- Ensemble de propriétés (optionnel)
- Nom du producteur
- Id de séquence (numéro d’ordre dans le topic, attribué
par le producteur)
- Timestamps
Cycle de vie des messages
Avec rétention message
acquitté
message
acquitté
Messages supprimés
(hors rétention)
Messages gardés car dans
la période de rétention
Non traités
message
acquitté
message
acquitté
message non
acquitté
message non
acquitté
Messages
supprimés
Messages supprimés
car au-delà du TTL
Non traités et
encore dans le TTL
message non
acquitté
message non
acquitté
message non
acquitté
message non
acquitté
message
acquitté
message
acquitté
Avec TTL
message
acquitté
message
acquitté
Messages supprimés Non traités
(sauvegardés dans BookKeeper)
message non
acquitté
message non
acquitté
message
acquitté
message
acquittéCas nominal
Démo
# Lancement de tous les composants
# broker, bookie, zookeeper (pour des tests/dev)
$ pulsar standalone
$ pulsar-admin clusters list
standalone
$ pulsar-admin clusters get standalone
{
"serviceUrl":"http://hostname:8080",
"brokerServiceUrl": "pulsar://hostname:6650"
}
# Producteur: 100 messages, 1msg/sec
$ pulsar-client produce 
-m "Hello Devoxx Morocco" 
-n 100 -r 1 
demo-topic
# Consommateur: 1msg/sec sans arrêt
$ pulsar-client consume 
-n 0 -r 1 
-s "demo-subs-exclusive" 
-t Exclusive 
demo-topic
Développons avec
Pulsar
+ API WebSocket
// Création d’un client (idem producteur et conso)
PulsarClient client = PulsarClient.builder()
.serviceUrl("pulsar://myhostname:6650")
.build();
.authentication(...)
.connectionsPerBroker(5)
.ioThreads(10)
.keepAliveInterval(2, TimeUnit.MINUTES)
.maxNumberOfRejectedRequestPerConnection(5)
.operationTimeout(10, TimeUnit.SECONDS)
...
Producer<byte[]> producer = client.newProducer()
.topic("demo-topic")
.producerName("demo-producer")
....
.create();
// Envoi synchrone
MessageId msgId = producer.send("Hi Devoxx!".getBytes());
// Envoi asynchrone
producer.sendAsync("Hi Devoxx!".getBytes())
.thenAccept(msgId -> {
System.out.printf("Msg %s successfully sent", msgId);
});
Consumer consumer = client.newConsumer()
.topic("demo-topic")
.subscriptionName("demo-exclusive-sub")
.subscriptionType(SubscriptionType.Exclusive)
.subscribe();
// Lecture à partir du premier message non acquitté
Message msg = consumer.receive(1000, TimeUnit.SECONDS);
System.out.printf("Message: %s, from %s with id=%sn",
new String(msg.getData()),
msg.getProducerName(),
msg.getMessageId());
consumer.acknowledge(msg); // A ne pas oublier
Schema Registry
Par défaut, le type des messages est byte[]
Pulsar fournit un système de contrôle des types de données:
uniquement valable pour les clients Java !!
Les schémas sont automatiquement uploadés sur les brokers à la
création des producteurs (et bien sûr sauvegardés dans
BookKeeper 😋)
Gestion des versions
// Côté producteur
Producer<Order> producer =
client.newProducer(JSONSchema.of(Order.class))
.topic("orders")
.create();
Order order = new Order(product, quantity);
producer.send(order);
// Côté consommateur
Consumer<Order> consumer =
client.newConsumer(JSONSchema.of(Order.class))
.topic("orders")
...
.subscribe();
Message<Order> msg =
consumer.receive(1000, TimeUnit.SECONDS);
Order order = msg.getValue();
Multi-tenancy
Multi-tenancy
Type de topic Nom de l’entité
(tenant)
Nom du
namespace
Nom du topic
persistent://public/default/demo-topic
Multi-tenancy
Pulsar Cluster
Sales Ops Tenants
DC1Online NamespacesStores
20 To
Topics
Rétention: 10j
Fraud ClientsOrders Logs
persistent://Sales/Stores/Clients
# Multi-tenancy
# - création entité
$ pulsar-admin tenants create sales
# - création namespace
$ pulsar-admin namespaces create sales/online
# - ajout de quotas
$ pulsar-admin namespaces set-retention 
--size 20T --time 2d sales/online
Pulsar Functions
Pulsar Functions
Topic de sortieF
But: offrir un cadre d’exécution de traitements des
données sans utiliser d’environnement complémentaire
Topic d’entrée 1
Topic d’entrée 2
Topic des logs
State
def process(input):
return "Hi %s!" % input
// Exemple le plus simple, sans framework
import java.util.function.Function;
public class HiFunction
implements Function<String, String> {
@Override
public String apply(String inputMsg) {
return String.format("Hi %s!", inputMsg);
}
}
import org.apache.pulsar.functions.api.Context;
import org.apache.pulsar.functions.api.Function;
import org.slf4j.Logger;
public class EnhancedHiFunction implements Function<String, String> {
@Override
public String process(String input, Context context) throws Exception {
Logger logger = context.getLogger();
String functionTenant = context.getTenant();
String functionNamespace = context.getNamespace();
String functionName = context.getFunctionName();
logger.info("Function {}/{}/{}: input={}",
functionTenant, functionNamespace, functionName, input);
return String.format("Hi %s!", input);
}
}
Dans les brokers
Pulsar Functions - Déploiement
Broker 1
Function workers
Broker 2
Function workers
Broker 1
Dans des containers
Function worker 1
Broker 2
Function worker 2
En local
Function
workers
# Déploiement d’une fonction
$ pulsar-admin functions create 
--jar my_pulsar_fct.jar 
--className MyPulsarFunction 
--fqfn demo/test/hello 
--inputs persistent://demo/test/input 
--output persistent://demo/test/output 
--log-topic persistent://demo/test/logs 
--cpu 8 
--ram 8589934592 
--disk 10737418240
Pulsar Functions
Exemples de cas d’utilisation des Functions:
- Routage des messages
- Filtrage
if ("US".equals(order.country())
context.publish("sales/online/orders-us", order);
else
context.publish("sales/online/orders-not-us", order);
public Order process(Order order) {
if (order.total() > 10000)
return order;
return null;
}
Pulsar Functions
Exemples de cas d’utilisation des Functions:
- Modification des messages
- Alertes
public Order process(Order order) {
order.setEmail(anonymize(order.getEmail()));
return order;
}
public String process(Sensor sensor) {
if (sensor.getTemp() > 50)
// Envoi d’un mail ...
return null;
}
Pulsar Functions
Et quoi d’autres ?
- stockage de métriques, de compteurs (stockés
dans Apache BookKeeper, bien sûr)
- utilisation de paramètres de config,
- fenêtrage (sliding window, tumbling window)
public Void process(Order order, Context context) {
Double threshold = context.getUserConfigValue("threshold");
Float previous = context.getState(order.getId() + "-metric");
context.incrCounter(order.getId() + "-metric", 1);
}
Pulsar IO
Pulsar IO
Pulsar
Topic
Connecteur
Source
Connecteur
Sink
Pulsar IO
CDC basé sur
SQL
Pulsar SQL
Basé sur
Lecture directe sur Apache BookKeeper
$ pulsar sql-worker run
$ pulsar sql
presto> show catalogs;
presto> show schemas in pulsar;
presto> show tables in
pulsar."demo/ecommerce";
Catalog
---------
pulsar
system
Schema
-----------------------
information_schema
public/default
public/functions
demo/ecommerce
Table
---------------
orders-all
orders-not-us
orders-usTOPICS
NAMESPACES
presto> select id, orderdate, ipaddress, amount, email
from pulsar."demo/ecommerce"."orders-all";
id | orderdate | ipaddress | amount | email
-------------+---------------+-----------------+--------+----------------------------------
307-02-9402 | 1561409774204 | 94.244.112.41 | 596.59 | robyn.kutch@hotmail.com
470-87-6280 | 1561409774501 | 82.244.158.201 | 135.39 | alexia.powlowski@gmail.com
842-89-5722 | 1561409774704 | 60.73.130.208 | 112.89 | zora.mccullough@hotmail.com
795-45-3565 | 1561409775408 | 231.96.223.0 | 60.75 | gerard.smitham@hotmail.com
876-36-9065 | 1561409775924 | 29.189.193.82 | 768.13 | ehtel.towne@gmail.com
840-97-8273 | 1561409776044 | 93.240.237.245 | 308.92 | don.gerlach@yahoo.com
043-41-7461 | 1561409776348 | 186.116.245.21 | 206.03 | raymond.bosco@gmail.com
069-72-8645 | 1561409776591 | 106.113.25.240 | 144.54 | alexandra.predovic@gmail.com
Geo-replication
Réplication géographique
Cluster A
Topic 1Producteur
Cluster B
Topic 1
Cluster C
Topic 1Consommateur
Les topics doivent appartenir à un
namespace global
Réplication asynchrone ou synchrone
(persistence local d’abord, puis envoi
aux autres clusters)
Possibilité pour un producteur de
restreindre la réplication à des
clusters donnés
Producteur
Démo
https://github.com/bbonnin/talk-intro-apache-pulsar
Autres frameworks
Ma supérette en ligne !!!
Broker
Topic
orders-all
Producteur Java
“Order Generator”
Consommateur CLI
“pulsar-client”
Functions
FilterOrder
Topic
orders-us
Connectors (IO)
Elasticsearch
Sink
SQL
Stockage
Bookie
Flink
Gestion des messages
Brokers
Stockage
Bookies
En résumé...
Traitements
Pulsar Functions
Connecteurs
Pulsar IO
Analytics
Pulsar SQL (Presto)
Stockage tiers
AWS Google Azure HDFS
Clients
Producteurs /
Consommateurs
Flink
Spark
Conclusion
Il existe beaucoup de fonctions
intéressantes :
- découplage broker et stockage
- tier-storage,
- geo-replication,
- Pulsar IO
- Pulsar Functions
- Schema registry,
- SQL,
- …
Environnement complet pour couvrir
vos besoins en termes de stream
processing
Aujourd’hui chez Yahoo !
- > 2 millions de topics
- > 100 milliards de messages / jour
- > 150 brokers
Plus d’infos: https://streaml.io/blog
Auto-promo 😛: https://github.com/bbonnin/pulsar-express
MERCI !
Illustrations: https://undraw.co/illustrations

Mais conteúdo relacionado

Mais procurados

Realtime Web avec Kafka, Spark et Mesos
Realtime Web avec Kafka, Spark et MesosRealtime Web avec Kafka, Spark et Mesos
Realtime Web avec Kafka, Spark et Mesosebiznext
 
Apache Cassandra - Concepts et fonctionnalités
Apache Cassandra - Concepts et fonctionnalitésApache Cassandra - Concepts et fonctionnalités
Apache Cassandra - Concepts et fonctionnalitésRomain Hardouin
 
Cassandra Ippevent 20 Juin 2013
Cassandra Ippevent 20 Juin 2013Cassandra Ippevent 20 Juin 2013
Cassandra Ippevent 20 Juin 2013vberetti
 
Apache Kafka, Un système distribué de messagerie hautement performant
Apache Kafka, Un système distribué de messagerie hautement performantApache Kafka, Un système distribué de messagerie hautement performant
Apache Kafka, Un système distribué de messagerie hautement performantALTIC Altic
 
Datastax Cassandra + Spark Streaming
Datastax Cassandra + Spark StreamingDatastax Cassandra + Spark Streaming
Datastax Cassandra + Spark StreamingVictor Coustenoble
 
Stockage et analyse temps réel d'événements avec Riak chez Booking.com
Stockage et analyse temps réel d'événements avec Riak chez Booking.comStockage et analyse temps réel d'événements avec Riak chez Booking.com
Stockage et analyse temps réel d'événements avec Riak chez Booking.comDamien Krotkine
 
Introduction à Cassandra
Introduction à CassandraIntroduction à Cassandra
Introduction à CassandraVMware Tanzu
 
Paris stormusergroup intrudocution
Paris stormusergroup intrudocutionParis stormusergroup intrudocution
Paris stormusergroup intrudocutionParis_Storm_UG
 
Performance de Percona XtraDB Cluster / Galera Cluster: Monitoring & Gestion ...
Performance de Percona XtraDB Cluster / Galera Cluster: Monitoring & Gestion ...Performance de Percona XtraDB Cluster / Galera Cluster: Monitoring & Gestion ...
Performance de Percona XtraDB Cluster / Galera Cluster: Monitoring & Gestion ...Severalnines
 
Cassandra pour les développeurs java
Cassandra pour les développeurs javaCassandra pour les développeurs java
Cassandra pour les développeurs javaJérémy Sevellec
 
Analytics et Big Data, une histoire de cubes...
Analytics et Big Data, une histoire de cubes...Analytics et Big Data, une histoire de cubes...
Analytics et Big Data, une histoire de cubes...Mathias Kluba
 
Sahara : Hadoop as Service avec OpenStack
Sahara : Hadoop as Service avec OpenStackSahara : Hadoop as Service avec OpenStack
Sahara : Hadoop as Service avec OpenStackALTIC Altic
 
[2017년 5월 정기세미나] Network with OpenStack - OpenStack Summit Boston Post
[2017년 5월 정기세미나] Network with OpenStack - OpenStack Summit Boston Post[2017년 5월 정기세미나] Network with OpenStack - OpenStack Summit Boston Post
[2017년 5월 정기세미나] Network with OpenStack - OpenStack Summit Boston PostOpenStack Korea Community
 
SQLSaturday Paris 2014 - SQL Server AlwaysOn et les groupes de disponibilités...
SQLSaturday Paris 2014 - SQL Server AlwaysOn et les groupes de disponibilités...SQLSaturday Paris 2014 - SQL Server AlwaysOn et les groupes de disponibilités...
SQLSaturday Paris 2014 - SQL Server AlwaysOn et les groupes de disponibilités...GUSS
 
Comment sauvegarder correctement vos données
Comment sauvegarder correctement vos donnéesComment sauvegarder correctement vos données
Comment sauvegarder correctement vos donnéesEDB
 
Le futur d'apache cassandra
Le futur d'apache cassandraLe futur d'apache cassandra
Le futur d'apache cassandraDuyhai Doan
 
Consolidez vos journaux et vos métriques avec Elastic Beats
Consolidez vos journaux et vos métriques avec Elastic BeatsConsolidez vos journaux et vos métriques avec Elastic Beats
Consolidez vos journaux et vos métriques avec Elastic Beatsgcatt
 
Delta Lake, un vernis pour parquet
Delta Lake, un vernis pour parquetDelta Lake, un vernis pour parquet
Delta Lake, un vernis pour parquetAlban Phélip
 

Mais procurados (20)

Realtime Web avec Kafka, Spark et Mesos
Realtime Web avec Kafka, Spark et MesosRealtime Web avec Kafka, Spark et Mesos
Realtime Web avec Kafka, Spark et Mesos
 
Apache Cassandra - Concepts et fonctionnalités
Apache Cassandra - Concepts et fonctionnalitésApache Cassandra - Concepts et fonctionnalités
Apache Cassandra - Concepts et fonctionnalités
 
Cassandra Ippevent 20 Juin 2013
Cassandra Ippevent 20 Juin 2013Cassandra Ippevent 20 Juin 2013
Cassandra Ippevent 20 Juin 2013
 
Apache Kafka, Un système distribué de messagerie hautement performant
Apache Kafka, Un système distribué de messagerie hautement performantApache Kafka, Un système distribué de messagerie hautement performant
Apache Kafka, Un système distribué de messagerie hautement performant
 
Webinar Degetel DataStax
Webinar Degetel DataStaxWebinar Degetel DataStax
Webinar Degetel DataStax
 
Datastax Cassandra + Spark Streaming
Datastax Cassandra + Spark StreamingDatastax Cassandra + Spark Streaming
Datastax Cassandra + Spark Streaming
 
Stockage et analyse temps réel d'événements avec Riak chez Booking.com
Stockage et analyse temps réel d'événements avec Riak chez Booking.comStockage et analyse temps réel d'événements avec Riak chez Booking.com
Stockage et analyse temps réel d'événements avec Riak chez Booking.com
 
Introduction à Cassandra
Introduction à CassandraIntroduction à Cassandra
Introduction à Cassandra
 
Paris stormusergroup intrudocution
Paris stormusergroup intrudocutionParis stormusergroup intrudocution
Paris stormusergroup intrudocution
 
Performance de Percona XtraDB Cluster / Galera Cluster: Monitoring & Gestion ...
Performance de Percona XtraDB Cluster / Galera Cluster: Monitoring & Gestion ...Performance de Percona XtraDB Cluster / Galera Cluster: Monitoring & Gestion ...
Performance de Percona XtraDB Cluster / Galera Cluster: Monitoring & Gestion ...
 
Cassandra pour les développeurs java
Cassandra pour les développeurs javaCassandra pour les développeurs java
Cassandra pour les développeurs java
 
Analytics et Big Data, une histoire de cubes...
Analytics et Big Data, une histoire de cubes...Analytics et Big Data, une histoire de cubes...
Analytics et Big Data, une histoire de cubes...
 
Sahara : Hadoop as Service avec OpenStack
Sahara : Hadoop as Service avec OpenStackSahara : Hadoop as Service avec OpenStack
Sahara : Hadoop as Service avec OpenStack
 
[2017년 5월 정기세미나] Network with OpenStack - OpenStack Summit Boston Post
[2017년 5월 정기세미나] Network with OpenStack - OpenStack Summit Boston Post[2017년 5월 정기세미나] Network with OpenStack - OpenStack Summit Boston Post
[2017년 5월 정기세미나] Network with OpenStack - OpenStack Summit Boston Post
 
SQLSaturday Paris 2014 - SQL Server AlwaysOn et les groupes de disponibilités...
SQLSaturday Paris 2014 - SQL Server AlwaysOn et les groupes de disponibilités...SQLSaturday Paris 2014 - SQL Server AlwaysOn et les groupes de disponibilités...
SQLSaturday Paris 2014 - SQL Server AlwaysOn et les groupes de disponibilités...
 
Comment sauvegarder correctement vos données
Comment sauvegarder correctement vos donnéesComment sauvegarder correctement vos données
Comment sauvegarder correctement vos données
 
REX Storm Redis
REX Storm RedisREX Storm Redis
REX Storm Redis
 
Le futur d'apache cassandra
Le futur d'apache cassandraLe futur d'apache cassandra
Le futur d'apache cassandra
 
Consolidez vos journaux et vos métriques avec Elastic Beats
Consolidez vos journaux et vos métriques avec Elastic BeatsConsolidez vos journaux et vos métriques avec Elastic Beats
Consolidez vos journaux et vos métriques avec Elastic Beats
 
Delta Lake, un vernis pour parquet
Delta Lake, un vernis pour parquetDelta Lake, un vernis pour parquet
Delta Lake, un vernis pour parquet
 

Semelhante a Stream processing avec Apache Pulsar

Messaging temps réel avec Go
Messaging temps réel avec GoMessaging temps réel avec Go
Messaging temps réel avec GoMickaël Rémond
 
BreizhCamp 2019 - IoT et open source hardware pour la collecte de timeseries
BreizhCamp 2019 - IoT et open source hardware pour la collecte de timeseriesBreizhCamp 2019 - IoT et open source hardware pour la collecte de timeseries
BreizhCamp 2019 - IoT et open source hardware pour la collecte de timeseriesXavier MARIN
 
Formation Play! framework
Formation Play! frameworkFormation Play! framework
Formation Play! frameworkBenoît Simard
 
Documentation serveur acs wibox (dev interne)
Documentation serveur acs wibox (dev interne)Documentation serveur acs wibox (dev interne)
Documentation serveur acs wibox (dev interne)Taha abbad andaloussi
 
RAPPORT DU PREMIER MINI PROJET «FORUM DE CHAT» Novembre 2005.pdf
RAPPORT DU PREMIER MINI PROJET «FORUM DE CHAT» Novembre 2005.pdfRAPPORT DU PREMIER MINI PROJET «FORUM DE CHAT» Novembre 2005.pdf
RAPPORT DU PREMIER MINI PROJET «FORUM DE CHAT» Novembre 2005.pdfSouf212
 
Spring Integration JUG SummerCamp 2013
Spring Integration JUG SummerCamp 2013Spring Integration JUG SummerCamp 2013
Spring Integration JUG SummerCamp 2013Gregory Boissinot
 
Aspect avec AspectJ
Aspect avec AspectJAspect avec AspectJ
Aspect avec AspectJsimeon
 
Rex docker en production meeutp-docker-nantes
Rex docker en production meeutp-docker-nantesRex docker en production meeutp-docker-nantes
Rex docker en production meeutp-docker-nantesChristophe Furmaniak
 
Presentation Symfony2
Presentation Symfony2Presentation Symfony2
Presentation Symfony2Ahmed ABATAL
 
Génération de documents Office avec Open XML et VSTO
Génération de documents Office avec Open XML et VSTOGénération de documents Office avec Open XML et VSTO
Génération de documents Office avec Open XML et VSTOguested7f6
 
ppt1.pptx
ppt1.pptxppt1.pptx
ppt1.pptxadiouf2
 
Architecture de services web de type ressource
Architecture de services web de type ressourceArchitecture de services web de type ressource
Architecture de services web de type ressourceAntoine Pouch
 
SonarQube Manuel Automatisation d'analyse ANT JENKINS/Hudson
SonarQube Manuel Automatisation d'analyse ANT JENKINS/HudsonSonarQube Manuel Automatisation d'analyse ANT JENKINS/Hudson
SonarQube Manuel Automatisation d'analyse ANT JENKINS/Hudsonxmacina
 

Semelhante a Stream processing avec Apache Pulsar (20)

Introduction à Apache Pulsar
 Introduction à Apache Pulsar Introduction à Apache Pulsar
Introduction à Apache Pulsar
 
Messaging temps réel avec Go
Messaging temps réel avec GoMessaging temps réel avec Go
Messaging temps réel avec Go
 
BreizhCamp 2019 - IoT et open source hardware pour la collecte de timeseries
BreizhCamp 2019 - IoT et open source hardware pour la collecte de timeseriesBreizhCamp 2019 - IoT et open source hardware pour la collecte de timeseries
BreizhCamp 2019 - IoT et open source hardware pour la collecte de timeseries
 
Formation Play! framework
Formation Play! frameworkFormation Play! framework
Formation Play! framework
 
Documentation serveur acs wibox (dev interne)
Documentation serveur acs wibox (dev interne)Documentation serveur acs wibox (dev interne)
Documentation serveur acs wibox (dev interne)
 
RAPPORT DU PREMIER MINI PROJET «FORUM DE CHAT» Novembre 2005.pdf
RAPPORT DU PREMIER MINI PROJET «FORUM DE CHAT» Novembre 2005.pdfRAPPORT DU PREMIER MINI PROJET «FORUM DE CHAT» Novembre 2005.pdf
RAPPORT DU PREMIER MINI PROJET «FORUM DE CHAT» Novembre 2005.pdf
 
Spring Integration JUG SummerCamp 2013
Spring Integration JUG SummerCamp 2013Spring Integration JUG SummerCamp 2013
Spring Integration JUG SummerCamp 2013
 
8-socket.pdf
8-socket.pdf8-socket.pdf
8-socket.pdf
 
Aspect avec AspectJ
Aspect avec AspectJAspect avec AspectJ
Aspect avec AspectJ
 
Rex docker en production meeutp-docker-nantes
Rex docker en production meeutp-docker-nantesRex docker en production meeutp-docker-nantes
Rex docker en production meeutp-docker-nantes
 
iTunes Stats
iTunes StatsiTunes Stats
iTunes Stats
 
Formation Google App Engine
Formation Google App EngineFormation Google App Engine
Formation Google App Engine
 
Presentation Symfony2
Presentation Symfony2Presentation Symfony2
Presentation Symfony2
 
Apache kafka big data track
Apache kafka   big data trackApache kafka   big data track
Apache kafka big data track
 
Génération de documents Office avec Open XML et VSTO
Génération de documents Office avec Open XML et VSTOGénération de documents Office avec Open XML et VSTO
Génération de documents Office avec Open XML et VSTO
 
ppt1.pptx
ppt1.pptxppt1.pptx
ppt1.pptx
 
Architecture de services web de type ressource
Architecture de services web de type ressourceArchitecture de services web de type ressource
Architecture de services web de type ressource
 
Php seance1
Php seance1Php seance1
Php seance1
 
SonarQube Manuel Automatisation d'analyse ANT JENKINS/Hudson
SonarQube Manuel Automatisation d'analyse ANT JENKINS/HudsonSonarQube Manuel Automatisation d'analyse ANT JENKINS/Hudson
SonarQube Manuel Automatisation d'analyse ANT JENKINS/Hudson
 
Paris RailsCamp 2009
Paris RailsCamp 2009Paris RailsCamp 2009
Paris RailsCamp 2009
 

Mais de Bruno Bonnin

[Devoxx MA 2023] R2DBC = R2D2 + JDBC (enfin presque...)
[Devoxx MA 2023] R2DBC = R2D2 + JDBC (enfin presque...)[Devoxx MA 2023] R2DBC = R2D2 + JDBC (enfin presque...)
[Devoxx MA 2023] R2DBC = R2D2 + JDBC (enfin presque...)Bruno Bonnin
 
Stream processing et SQL
Stream processing et SQLStream processing et SQL
Stream processing et SQLBruno Bonnin
 
Stream processing et SQL
Stream processing et SQLStream processing et SQL
Stream processing et SQLBruno Bonnin
 
Guide (un tout petit peu) pratique (et totalement subjectif) du stream proces...
Guide (un tout petit peu) pratique (et totalement subjectif) du stream proces...Guide (un tout petit peu) pratique (et totalement subjectif) du stream proces...
Guide (un tout petit peu) pratique (et totalement subjectif) du stream proces...Bruno Bonnin
 
Stream processing et SQL
Stream processing et SQLStream processing et SQL
Stream processing et SQLBruno Bonnin
 
Stream processing et SQL
Stream processing et SQLStream processing et SQL
Stream processing et SQLBruno Bonnin
 
Jug summer camp 2017 - Vue.js, même un dev java peut en faire !
Jug summer camp 2017 - Vue.js, même un dev java peut en faire !Jug summer camp 2017 - Vue.js, même un dev java peut en faire !
Jug summer camp 2017 - Vue.js, même un dev java peut en faire !Bruno Bonnin
 
A la découverte de vue.js
A la découverte de vue.jsA la découverte de vue.js
A la découverte de vue.jsBruno Bonnin
 
Vue.js, même un dev java peut en faire !
Vue.js, même un dev java peut en faire !Vue.js, même un dev java peut en faire !
Vue.js, même un dev java peut en faire !Bruno Bonnin
 
Explorez vos données présentes dans MongoDB avec Apache Zeppelin
Explorez vos données présentes dans MongoDB avec Apache ZeppelinExplorez vos données présentes dans MongoDB avec Apache Zeppelin
Explorez vos données présentes dans MongoDB avec Apache ZeppelinBruno Bonnin
 
Vue, j’avais pas vu !
Vue, j’avais pas vu !Vue, j’avais pas vu !
Vue, j’avais pas vu !Bruno Bonnin
 
Apache Spark avec NodeJS ? Oui, c'est possible avec EclairJS !
Apache Spark avec NodeJS ? Oui, c'est possible avec EclairJS !Apache Spark avec NodeJS ? Oui, c'est possible avec EclairJS !
Apache Spark avec NodeJS ? Oui, c'est possible avec EclairJS !Bruno Bonnin
 
Big Data Viz (and much more!) with Apache Zeppelin
Big Data Viz (and much more!) with Apache ZeppelinBig Data Viz (and much more!) with Apache Zeppelin
Big Data Viz (and much more!) with Apache ZeppelinBruno Bonnin
 
Tout ce que le getting started mongodb ne vous dira pas
Tout ce que le getting started mongodb ne vous dira pasTout ce que le getting started mongodb ne vous dira pas
Tout ce que le getting started mongodb ne vous dira pasBruno Bonnin
 
Explorez vos données avec apache zeppelin
Explorez vos données avec apache zeppelinExplorez vos données avec apache zeppelin
Explorez vos données avec apache zeppelinBruno Bonnin
 
Tout ce que le getting started MongoDB ne vous dira pas
Tout ce que le getting started MongoDB ne vous dira pasTout ce que le getting started MongoDB ne vous dira pas
Tout ce que le getting started MongoDB ne vous dira pasBruno Bonnin
 
MUG Nantes - MongoDB et son connecteur pour hadoop
MUG Nantes - MongoDB et son connecteur pour hadoopMUG Nantes - MongoDB et son connecteur pour hadoop
MUG Nantes - MongoDB et son connecteur pour hadoopBruno Bonnin
 
Breizhcamp 2015 - Comment (ne pas réussir à) modéliser ses data dans elastics...
Breizhcamp 2015 - Comment (ne pas réussir à) modéliser ses data dans elastics...Breizhcamp 2015 - Comment (ne pas réussir à) modéliser ses data dans elastics...
Breizhcamp 2015 - Comment (ne pas réussir à) modéliser ses data dans elastics...Bruno Bonnin
 

Mais de Bruno Bonnin (18)

[Devoxx MA 2023] R2DBC = R2D2 + JDBC (enfin presque...)
[Devoxx MA 2023] R2DBC = R2D2 + JDBC (enfin presque...)[Devoxx MA 2023] R2DBC = R2D2 + JDBC (enfin presque...)
[Devoxx MA 2023] R2DBC = R2D2 + JDBC (enfin presque...)
 
Stream processing et SQL
Stream processing et SQLStream processing et SQL
Stream processing et SQL
 
Stream processing et SQL
Stream processing et SQLStream processing et SQL
Stream processing et SQL
 
Guide (un tout petit peu) pratique (et totalement subjectif) du stream proces...
Guide (un tout petit peu) pratique (et totalement subjectif) du stream proces...Guide (un tout petit peu) pratique (et totalement subjectif) du stream proces...
Guide (un tout petit peu) pratique (et totalement subjectif) du stream proces...
 
Stream processing et SQL
Stream processing et SQLStream processing et SQL
Stream processing et SQL
 
Stream processing et SQL
Stream processing et SQLStream processing et SQL
Stream processing et SQL
 
Jug summer camp 2017 - Vue.js, même un dev java peut en faire !
Jug summer camp 2017 - Vue.js, même un dev java peut en faire !Jug summer camp 2017 - Vue.js, même un dev java peut en faire !
Jug summer camp 2017 - Vue.js, même un dev java peut en faire !
 
A la découverte de vue.js
A la découverte de vue.jsA la découverte de vue.js
A la découverte de vue.js
 
Vue.js, même un dev java peut en faire !
Vue.js, même un dev java peut en faire !Vue.js, même un dev java peut en faire !
Vue.js, même un dev java peut en faire !
 
Explorez vos données présentes dans MongoDB avec Apache Zeppelin
Explorez vos données présentes dans MongoDB avec Apache ZeppelinExplorez vos données présentes dans MongoDB avec Apache Zeppelin
Explorez vos données présentes dans MongoDB avec Apache Zeppelin
 
Vue, j’avais pas vu !
Vue, j’avais pas vu !Vue, j’avais pas vu !
Vue, j’avais pas vu !
 
Apache Spark avec NodeJS ? Oui, c'est possible avec EclairJS !
Apache Spark avec NodeJS ? Oui, c'est possible avec EclairJS !Apache Spark avec NodeJS ? Oui, c'est possible avec EclairJS !
Apache Spark avec NodeJS ? Oui, c'est possible avec EclairJS !
 
Big Data Viz (and much more!) with Apache Zeppelin
Big Data Viz (and much more!) with Apache ZeppelinBig Data Viz (and much more!) with Apache Zeppelin
Big Data Viz (and much more!) with Apache Zeppelin
 
Tout ce que le getting started mongodb ne vous dira pas
Tout ce que le getting started mongodb ne vous dira pasTout ce que le getting started mongodb ne vous dira pas
Tout ce que le getting started mongodb ne vous dira pas
 
Explorez vos données avec apache zeppelin
Explorez vos données avec apache zeppelinExplorez vos données avec apache zeppelin
Explorez vos données avec apache zeppelin
 
Tout ce que le getting started MongoDB ne vous dira pas
Tout ce que le getting started MongoDB ne vous dira pasTout ce que le getting started MongoDB ne vous dira pas
Tout ce que le getting started MongoDB ne vous dira pas
 
MUG Nantes - MongoDB et son connecteur pour hadoop
MUG Nantes - MongoDB et son connecteur pour hadoopMUG Nantes - MongoDB et son connecteur pour hadoop
MUG Nantes - MongoDB et son connecteur pour hadoop
 
Breizhcamp 2015 - Comment (ne pas réussir à) modéliser ses data dans elastics...
Breizhcamp 2015 - Comment (ne pas réussir à) modéliser ses data dans elastics...Breizhcamp 2015 - Comment (ne pas réussir à) modéliser ses data dans elastics...
Breizhcamp 2015 - Comment (ne pas réussir à) modéliser ses data dans elastics...
 

Stream processing avec Apache Pulsar

  • 1. Stream processing avec Apache Pulsar Bruno Bonnin @_bruno_b_ https://bonnin.dev
  • 2. Directeur Technique / Consultant @ Zenika Nantes
  • 3.
  • 4. Pulsar, un système de messagerie distribué Né chez Yahoo ! pour compenser certaines limites des solutions de l’époque Pour des apps critiques comme Yahoo Mail, Yahoo Finance, Yahoo Sports, etc Open sourcé en 2016 Devenu Top Level Project de la fondation Apache en sept 2018 Premier déploiement Q2 2015
  • 6. Des producteurs, des consommateurs, des topics, ... Topic 1 Producteur Consommateur Topic 2 Topic 3
  • 7. Gestion des messages Producteurs Stockage des messages Bookie 1 Bookie 2 Bookie 3 Bookie 4 Consommateurs zkServer 1 zkServer 2 zkServer 3 Broker 1 Broker 2 Broker 3 lecture stockage meta-données coordination clusters stockage meta-données stockage des données Des brokers, des bookies, ... écriture Apache BookKeeper Apache Zookeeper
  • 8. Bookie 1 Une architecture scalable Broker 1 Broker 2 Bookie 2 Bookie 3 Bookie 4 Gestion des messages Stockage des messages Producteurs Consommateurs Broker 3 Bookie 5 Topic 1
  • 9. Apache BookKeeper Système de stockage scalable, tolérant aux pannes et à faible latence Conçu à l’origine comme une solution pour la haute disponibilité du NameNode de HDFS (WAL : Write-Ahead Logging) Avec Pulsar: stockage des données et des offsets (cursors)
  • 10. Broker Topic 1 segment 2segment 1 segment x... Bookie 1 segment 1 Une architecture hautement disponible segment 1 segment 1 segment x segment x segment 2 segment 2 Bookie 2 Bookie 3 Un topic est constitué d’un ensemble de segments (ledgers) contenant les messages. Les segments sont stockés et répartis sur les bookies.segment x segment 2 Bookie 4
  • 11. Broker Topic 1 segment 2segment 1 segment x... Bookie 1 segment 1 Une architecture hautement disponible segment 1 segment 1 segment x segment x segment 2 segment 2 Bookie 2 Bookie 3 Sur défection d’un bookie, automatiquement, récupération des segments manquants pour respecter le facteur de réplication segment x segment 2 Bookie 4 segment x segment 1
  • 13. TopicProducteur Consommateur - A1 Exclusive subscription Subscription A Consommateur - A2Les tentatives de connexions de A2 échoueront Topics et abonnements
  • 14. TopicProducteur Consommateur - B1 Fail-over subscription Subscription B Consommateur - B2 Messages consommés par B2, uniquement en cas d’échec de B1 Topics et abonnements
  • 15. TopicProducteur Consommateur - C1Subscription C Consommateur - C2 Les messages sont envoyés aux deux consommateurs (round robin) -> aucune garantie d’ordre ! Topics et abonnements Shared subscription
  • 16. TopicProducteur Consommateur - B1 Consommateur - B2 Consommateur - A1 Consommateur - C1 Consommateur - C2 Exclusive Subscription Il peut y avoir plusieurs abonnements sur un topic Fail-over Subscription Shared Subscription Topics et abonnements
  • 18. Messages Contenu d’un message: - Tableau d’octets (peut être conforme à un schéma) - Clé (optionnel) - Ensemble de propriétés (optionnel) - Nom du producteur - Id de séquence (numéro d’ordre dans le topic, attribué par le producteur) - Timestamps
  • 19. Cycle de vie des messages Avec rétention message acquitté message acquitté Messages supprimés (hors rétention) Messages gardés car dans la période de rétention Non traités message acquitté message acquitté message non acquitté message non acquitté Messages supprimés Messages supprimés car au-delà du TTL Non traités et encore dans le TTL message non acquitté message non acquitté message non acquitté message non acquitté message acquitté message acquitté Avec TTL message acquitté message acquitté Messages supprimés Non traités (sauvegardés dans BookKeeper) message non acquitté message non acquitté message acquitté message acquittéCas nominal
  • 20. Démo
  • 21. # Lancement de tous les composants # broker, bookie, zookeeper (pour des tests/dev) $ pulsar standalone $ pulsar-admin clusters list standalone $ pulsar-admin clusters get standalone { "serviceUrl":"http://hostname:8080", "brokerServiceUrl": "pulsar://hostname:6650" }
  • 22. # Producteur: 100 messages, 1msg/sec $ pulsar-client produce -m "Hello Devoxx Morocco" -n 100 -r 1 demo-topic # Consommateur: 1msg/sec sans arrêt $ pulsar-client consume -n 0 -r 1 -s "demo-subs-exclusive" -t Exclusive demo-topic
  • 25. // Création d’un client (idem producteur et conso) PulsarClient client = PulsarClient.builder() .serviceUrl("pulsar://myhostname:6650") .build(); .authentication(...) .connectionsPerBroker(5) .ioThreads(10) .keepAliveInterval(2, TimeUnit.MINUTES) .maxNumberOfRejectedRequestPerConnection(5) .operationTimeout(10, TimeUnit.SECONDS) ...
  • 26. Producer<byte[]> producer = client.newProducer() .topic("demo-topic") .producerName("demo-producer") .... .create(); // Envoi synchrone MessageId msgId = producer.send("Hi Devoxx!".getBytes()); // Envoi asynchrone producer.sendAsync("Hi Devoxx!".getBytes()) .thenAccept(msgId -> { System.out.printf("Msg %s successfully sent", msgId); });
  • 27. Consumer consumer = client.newConsumer() .topic("demo-topic") .subscriptionName("demo-exclusive-sub") .subscriptionType(SubscriptionType.Exclusive) .subscribe(); // Lecture à partir du premier message non acquitté Message msg = consumer.receive(1000, TimeUnit.SECONDS); System.out.printf("Message: %s, from %s with id=%sn", new String(msg.getData()), msg.getProducerName(), msg.getMessageId()); consumer.acknowledge(msg); // A ne pas oublier
  • 28. Schema Registry Par défaut, le type des messages est byte[] Pulsar fournit un système de contrôle des types de données: uniquement valable pour les clients Java !! Les schémas sont automatiquement uploadés sur les brokers à la création des producteurs (et bien sûr sauvegardés dans BookKeeper 😋) Gestion des versions
  • 29. // Côté producteur Producer<Order> producer = client.newProducer(JSONSchema.of(Order.class)) .topic("orders") .create(); Order order = new Order(product, quantity); producer.send(order);
  • 30. // Côté consommateur Consumer<Order> consumer = client.newConsumer(JSONSchema.of(Order.class)) .topic("orders") ... .subscribe(); Message<Order> msg = consumer.receive(1000, TimeUnit.SECONDS); Order order = msg.getValue();
  • 32. Multi-tenancy Type de topic Nom de l’entité (tenant) Nom du namespace Nom du topic persistent://public/default/demo-topic
  • 33. Multi-tenancy Pulsar Cluster Sales Ops Tenants DC1Online NamespacesStores 20 To Topics Rétention: 10j Fraud ClientsOrders Logs persistent://Sales/Stores/Clients
  • 34. # Multi-tenancy # - création entité $ pulsar-admin tenants create sales # - création namespace $ pulsar-admin namespaces create sales/online # - ajout de quotas $ pulsar-admin namespaces set-retention --size 20T --time 2d sales/online
  • 36. Pulsar Functions Topic de sortieF But: offrir un cadre d’exécution de traitements des données sans utiliser d’environnement complémentaire Topic d’entrée 1 Topic d’entrée 2 Topic des logs State
  • 38. // Exemple le plus simple, sans framework import java.util.function.Function; public class HiFunction implements Function<String, String> { @Override public String apply(String inputMsg) { return String.format("Hi %s!", inputMsg); } }
  • 39. import org.apache.pulsar.functions.api.Context; import org.apache.pulsar.functions.api.Function; import org.slf4j.Logger; public class EnhancedHiFunction implements Function<String, String> { @Override public String process(String input, Context context) throws Exception { Logger logger = context.getLogger(); String functionTenant = context.getTenant(); String functionNamespace = context.getNamespace(); String functionName = context.getFunctionName(); logger.info("Function {}/{}/{}: input={}", functionTenant, functionNamespace, functionName, input); return String.format("Hi %s!", input); } }
  • 40. Dans les brokers Pulsar Functions - Déploiement Broker 1 Function workers Broker 2 Function workers Broker 1 Dans des containers Function worker 1 Broker 2 Function worker 2 En local Function workers
  • 41. # Déploiement d’une fonction $ pulsar-admin functions create --jar my_pulsar_fct.jar --className MyPulsarFunction --fqfn demo/test/hello --inputs persistent://demo/test/input --output persistent://demo/test/output --log-topic persistent://demo/test/logs --cpu 8 --ram 8589934592 --disk 10737418240
  • 42. Pulsar Functions Exemples de cas d’utilisation des Functions: - Routage des messages - Filtrage if ("US".equals(order.country()) context.publish("sales/online/orders-us", order); else context.publish("sales/online/orders-not-us", order); public Order process(Order order) { if (order.total() > 10000) return order; return null; }
  • 43. Pulsar Functions Exemples de cas d’utilisation des Functions: - Modification des messages - Alertes public Order process(Order order) { order.setEmail(anonymize(order.getEmail())); return order; } public String process(Sensor sensor) { if (sensor.getTemp() > 50) // Envoi d’un mail ... return null; }
  • 44. Pulsar Functions Et quoi d’autres ? - stockage de métriques, de compteurs (stockés dans Apache BookKeeper, bien sûr) - utilisation de paramètres de config, - fenêtrage (sliding window, tumbling window) public Void process(Order order, Context context) { Double threshold = context.getUserConfigValue("threshold"); Float previous = context.getState(order.getId() + "-metric"); context.incrCounter(order.getId() + "-metric", 1); }
  • 48. SQL
  • 49. Pulsar SQL Basé sur Lecture directe sur Apache BookKeeper
  • 51. $ pulsar sql presto> show catalogs; presto> show schemas in pulsar; presto> show tables in pulsar."demo/ecommerce"; Catalog --------- pulsar system Schema ----------------------- information_schema public/default public/functions demo/ecommerce Table --------------- orders-all orders-not-us orders-usTOPICS NAMESPACES
  • 52. presto> select id, orderdate, ipaddress, amount, email from pulsar."demo/ecommerce"."orders-all"; id | orderdate | ipaddress | amount | email -------------+---------------+-----------------+--------+---------------------------------- 307-02-9402 | 1561409774204 | 94.244.112.41 | 596.59 | robyn.kutch@hotmail.com 470-87-6280 | 1561409774501 | 82.244.158.201 | 135.39 | alexia.powlowski@gmail.com 842-89-5722 | 1561409774704 | 60.73.130.208 | 112.89 | zora.mccullough@hotmail.com 795-45-3565 | 1561409775408 | 231.96.223.0 | 60.75 | gerard.smitham@hotmail.com 876-36-9065 | 1561409775924 | 29.189.193.82 | 768.13 | ehtel.towne@gmail.com 840-97-8273 | 1561409776044 | 93.240.237.245 | 308.92 | don.gerlach@yahoo.com 043-41-7461 | 1561409776348 | 186.116.245.21 | 206.03 | raymond.bosco@gmail.com 069-72-8645 | 1561409776591 | 106.113.25.240 | 144.54 | alexandra.predovic@gmail.com
  • 54. Réplication géographique Cluster A Topic 1Producteur Cluster B Topic 1 Cluster C Topic 1Consommateur Les topics doivent appartenir à un namespace global Réplication asynchrone ou synchrone (persistence local d’abord, puis envoi aux autres clusters) Possibilité pour un producteur de restreindre la réplication à des clusters donnés Producteur
  • 56. Autres frameworks Ma supérette en ligne !!! Broker Topic orders-all Producteur Java “Order Generator” Consommateur CLI “pulsar-client” Functions FilterOrder Topic orders-us Connectors (IO) Elasticsearch Sink SQL Stockage Bookie Flink
  • 57. Gestion des messages Brokers Stockage Bookies En résumé... Traitements Pulsar Functions Connecteurs Pulsar IO Analytics Pulsar SQL (Presto) Stockage tiers AWS Google Azure HDFS Clients Producteurs / Consommateurs Flink Spark
  • 58.
  • 59. Conclusion Il existe beaucoup de fonctions intéressantes : - découplage broker et stockage - tier-storage, - geo-replication, - Pulsar IO - Pulsar Functions - Schema registry, - SQL, - … Environnement complet pour couvrir vos besoins en termes de stream processing Aujourd’hui chez Yahoo ! - > 2 millions de topics - > 100 milliards de messages / jour - > 150 brokers Plus d’infos: https://streaml.io/blog