SlideShare una empresa de Scribd logo
1 de 27
Distributed & highly available server
applications in Java and Scala
Max Alexejev, Aleksei Kornev
JavaOne Moscow 2013
24 April 2013
What is talkbits?
Architecture
by Max Alexejev
Lightweight SOA
Key principles
•S1, S2 - edge services
•Each service is 0..1 servers and
0..N clients built together
•No special "broker" services
•All services are stateless
•All instances are equal
What about state?
State is kept is specialized
distributed systems and fronted
by specific services.
Example follows...
Case study: Talkbits backend
Recursive call
Requirements for a distrubuted RPC system
Must have and nice to have
•Elastic and reliable discovery - schould handle nodes brought up and
shut down transparently and not be a SPOF itself
•Support for N-N topology of client and server instances
•Disconnect detection and transparent reconnects
•Fault tolerance - for example, by retries to remaining instances where
called instance goes down
•Clients backoff built-in - i.e., clients should not overload servers when
load spikes - as far as possible
•Configurable load distribution - i.e., which server instance to call for
this specific request
•Configurable networking layer - keepalives & heartbeats, timeouts,
connection pools etc.)
•Distributed tracing facilities
•Portability among different platforms
•Distributed stack traces for exceptions
•Transactions
Key principles to be lightweight and get rid of architectural waste
•Java SE
•No containers. Even servlet containers are light and built-in
•Standalone applications: unified configuration, deployment, metrics,
logging, single development framework - more on this later
•All launched istances are equal and process requests - no "special"
nodes or "active-standby" patterns
•Minimal dependencies and JAR size
•Minimal memory footprint
•One service - one purpose
•Highly tuned for this one purpose (app, JVM, OS, HW)
•Isolated fault domains - i.e., single datasource or external service is
fronted by one service only
No bloatware in technology stack!
"Lean" services
Finagle library
(twitter.github.io/finagle) acts
as a distributed RPC
framework.
Services are written in Java
and Scala and use Thrift
communication protocol.
Talkbits implementation choices
Apache Zookeeper (zookeeper.apache.org)
Provides reliable service discovery mechanics. Finagle has a nice built-in
integration with Zookeeper.
Finagle server: networking
Finagle is built on top of Netty - asynchronous, non-blocking TCP server.
Finagle codec
trait Codec[Req, Rep]
class ThriftClientFramedCodec(...) extends Codec[ThriftClientRequest, Array[Byte]] {
pipeline.addLast("thriftFrameCodec", new ThriftFrameCodec)
pipeline.addLast("byteEncoder", new ThriftClientChannelBufferEncoder)
pipeline.addLast("byteDecoder", new ThriftChannelBufferDecoder)
...
}
Finagle comes with ready-made codecs for
Thrift, HTTP, Memcache, Kestrel, HTTP streaming.
Finagle services and filters
// Service is simply a function from request to a future of response.
trait Service[Req, Rep] extends (Req => Future[Rep])
// Filter[A, B, C, D] converts a Service[C, D] to a Service[A, B].
abstract class Filter[-ReqIn, +RepOut, +ReqOut, -RepIn]
extends ((ReqIn, Service[ReqOut, RepIn]) => Future[RepOut])
abstract class SimpleFilter[Req, Rep] extends Filter[Req, Rep, Req, Rep]
// Service transformation example
val serviceWithTimeout: Service[Req, Rep] =
new RetryFilter[Req, Rep](..) andThen
new TimeoutFilter[Req, Rep](..) andThen
service
Finagle comes with
rate limiting, retries,
statistics, tracing,
uncaught exceptions
handling, timeouts and
more.
Functional composition
Given Future[A]
Sequential composition
def map[B](f: A => B): Future[B]
def flatMap[B](f: A => Future[B]): Future[B]
def rescue[B >: A](rescueException: PartialFunction[Throwable, Future[B]]): Future[B]
Concurrent composition
def collect[A](fs: Seq[Future[A]]): Future[Seq[A]]
def select[A](fs: Seq[Future[A]]): Future[(Try[A], Seq[Future[A]])]
And more
Functional composition on RPC calls
Sequential composition
val nearestChannel: Future[Channel] =
metadataClient.getUserById(uuid) flatMap {
user => geolocationClient.getNearestChannelId( user.getLocation() )
} flatMap {
channelId => metadataClient.getChannelById( channelId )
}
Concurrent composition
val userA: Future[User] = metadataClient.getUserById(“a”)
val userB: Future[User] = metadataClient.getUserById(“b”)
val userC: Future[User] = metadataClient.getUserById(“c”)
val users = Future.collect(Seq(userA, userB, userC)).get()
*All this stuff works in Java just like in Scala, but does
not look as cool.
Finagle server: threading model
You should never block worker threads in order to achieve high
performance (throughput).
For blocking IO or long compuntations, delegate to FuturePool.
val diskIoFuturePool = FuturePool(Executors.newFixedThreadPool(4))
diskIoFuturePool( { scala.Source.fromFile(..) } )
Boss thread accepts new
client connections and
binds NIO Channel to a
specific worker thread.
Worker threads perform
all client IO.
More gifts and bonuses from Finagle
In addition to all said before, Finagle has
•Load-distribution in N-N topos - HeapBalancer ("least active
connections") by default
•Client backoff strategies - comes with TruncatedBinaryBackoff
implementation
•Failure detection
•Failover/Retry
•Connection Pooling
•Distributed Tracing (Zipkin project based on Google Dapper paper)
Finagle, Thrift & Java: lessons learned
Pros
•Gives a lot out of the box
•Production-proven and stable
•Active development community
•Lots of extension points in the library
Cons
•Good for Scala, usable with Java
•Works well with Thrift and HTTP (plus trivial protocols), but lacks
support for Protobuf and other stuff
•Poor exceptions handling experience with Java (no Scala match-es)
and ugly code
•finagle-thrift is a pain (old libthrift version lock-in, Cassandra
dependencies clash, cannot return nulls, and more). All problems
avoidable thought.
•Cluster scatters and never gathers when whole Zookeeper ensemble is
Finagle: competitors & alternatives
Trending
•Akka 2.0 (Scala, OpenSource) by Typesafe
•ZeroRPC (Python & Node.js, OpenSource) by DotCloud
•RxJava (Java, OpenSource) by Netflix
Old
•JGroups (Java, OpenSource)
•JBOSS Remoting (Java, OpenSource) by JBOSS
•Spread Toolkit (C/C++, Commercial & OpenSource)
Configuration, deployment,
monitoring and logging
by Aleksei Kornev
Get stuff done...
Typical application
Architecture of talkbits service
One way to configure service, logs, metrics.
One way to package and deploy service.
One way to lunch service.
Bundled in one-jar.
One delivery unit. Contains:
Java service
In a single executable fat-jar.
Installation script
[Re]installs service on the machine,
registers it in /etc/init.d
Init.d script
Contains instructions to start, stop,
Delivery
Logging
Confuguration
•SLF4J as an API, all other libraries redirected
•Logback as a logging implementation
•Each service logs to /var/log/talkbits/... (application logs, GC logs)
•Daily rotation policy applied
•Also sent to loggly.com for aggregation, grouping etc.
Aggregation
•loggly.com
•sshfs for analyzing logs by means of linux tools such as grep, tail, less,
etc.
Aggregation alternatives
Splunk.com, Flume, Scribe, etc...
Metrics
Application metrics and health checks are implemented with CodaHale lib
(metrics.codahale.com). Codahale reports metrics via JMX.
Jolokia JVM agent (www.jolokia.org/agent/jvm.html) exposes JMX beans
via REST (JSON / HTTP), using JVMs internal HTTP server.
Monitoring agent use jolokia REST interface to fetch metrics and send
them to monitoring system.
All metrics are divided into common metrics (HW, JVM, etc) and service-
specific metrics.
Deployment
Fabric (http://fabfile.org) used for
environments provisioning and
services deployment.
Process
•Fabric script provisions new env (or
uses existing) by cluster scheme
•Amazon instances are automatically
tagged with services list (i.e.,
instance roles)
•Fabric script reads instance roles
and deploys (redeploys) appropriate
components.
Monitoring
As monitoring platform we chose Datadoghq.com. Datadog is a SaaS
which is easy to integrate into your infrastucture. Datadog agent is
opensourced and implemented in Python. There are many predefined
checksets (plugins, or integrations) for popular products out of the box -
including JVM, Cassandra, Zookeeper and ElasticSearch.
Datadog provides REST API.
Alternatives
•Nagios, Zabbix - need to have bearded admin in team. We wanted to go
SaaS and outsource infrastructure as far as possible.
•Amazon CloudWatch, LogicMonitor, ManageEngine, etc.
Process
Each service has own monitoring agent instance on a single machine. If
node has 'monitoring-agent' role in the roles tag of EC2 instance,
monitoring agent will be installed for each service on this node.
Talkbits cluster structure
QA
Max Alexejev
http://ru.linkedin.com/pub/max-alexejev/51/820/ab9
http://www.slideshare.net/MaxAlexejev/
malexejev@gmail.com
Aleksei Kornev
aleksei.kornev@gmail.com

Más contenido relacionado

La actualidad más candente

Apache Kafka Architecture & Fundamentals Explained
Apache Kafka Architecture & Fundamentals ExplainedApache Kafka Architecture & Fundamentals Explained
Apache Kafka Architecture & Fundamentals Explainedconfluent
 
Pulsar - flexible pub-sub for internet scale
Pulsar - flexible pub-sub for internet scalePulsar - flexible pub-sub for internet scale
Pulsar - flexible pub-sub for internet scaleMatteo Merli
 
Kafka Overview
Kafka OverviewKafka Overview
Kafka Overviewiamtodor
 
Apache Kafka: A high-throughput distributed messaging system @ JCConf 2014
Apache Kafka: A high-throughput distributed messaging system @ JCConf 2014Apache Kafka: A high-throughput distributed messaging system @ JCConf 2014
Apache Kafka: A high-throughput distributed messaging system @ JCConf 2014Chen-en Lu
 
Apache Kafka - Free Friday
Apache Kafka - Free FridayApache Kafka - Free Friday
Apache Kafka - Free FridayOtávio Carvalho
 
October 2016 HUG: Pulsar,  a highly scalable, low latency pub-sub messaging s...
October 2016 HUG: Pulsar,  a highly scalable, low latency pub-sub messaging s...October 2016 HUG: Pulsar,  a highly scalable, low latency pub-sub messaging s...
October 2016 HUG: Pulsar,  a highly scalable, low latency pub-sub messaging s...Yahoo Developer Network
 
What's New in Apache Pulsar 2.9- Pulsar Summit Asia 2021
What's New in Apache Pulsar 2.9- Pulsar Summit Asia 2021What's New in Apache Pulsar 2.9- Pulsar Summit Asia 2021
What's New in Apache Pulsar 2.9- Pulsar Summit Asia 2021StreamNative
 
High performance messaging with Apache Pulsar
High performance messaging with Apache PulsarHigh performance messaging with Apache Pulsar
High performance messaging with Apache PulsarMatteo Merli
 
Messaging With ActiveMQ
Messaging With ActiveMQMessaging With ActiveMQ
Messaging With ActiveMQBruce Snyder
 
Effectively-once semantics in Apache Pulsar
Effectively-once semantics in Apache PulsarEffectively-once semantics in Apache Pulsar
Effectively-once semantics in Apache PulsarMatteo Merli
 
Apache Kafka Introduction
Apache Kafka IntroductionApache Kafka Introduction
Apache Kafka IntroductionAmita Mirajkar
 
Comparing CoAP vs MQTT
Comparing CoAP vs MQTTComparing CoAP vs MQTT
Comparing CoAP vs MQTTkellogh
 
Wso2 esb 5.0.0 product release webinar
Wso2 esb 5.0.0   product release webinarWso2 esb 5.0.0   product release webinar
Wso2 esb 5.0.0 product release webinarChanaka Fernando
 

La actualidad más candente (18)

Apache Kafka Architecture & Fundamentals Explained
Apache Kafka Architecture & Fundamentals ExplainedApache Kafka Architecture & Fundamentals Explained
Apache Kafka Architecture & Fundamentals Explained
 
Pulsar - flexible pub-sub for internet scale
Pulsar - flexible pub-sub for internet scalePulsar - flexible pub-sub for internet scale
Pulsar - flexible pub-sub for internet scale
 
Kafka Overview
Kafka OverviewKafka Overview
Kafka Overview
 
Apache Kafka: A high-throughput distributed messaging system @ JCConf 2014
Apache Kafka: A high-throughput distributed messaging system @ JCConf 2014Apache Kafka: A high-throughput distributed messaging system @ JCConf 2014
Apache Kafka: A high-throughput distributed messaging system @ JCConf 2014
 
Apache Kafka - Free Friday
Apache Kafka - Free FridayApache Kafka - Free Friday
Apache Kafka - Free Friday
 
October 2016 HUG: Pulsar,  a highly scalable, low latency pub-sub messaging s...
October 2016 HUG: Pulsar,  a highly scalable, low latency pub-sub messaging s...October 2016 HUG: Pulsar,  a highly scalable, low latency pub-sub messaging s...
October 2016 HUG: Pulsar,  a highly scalable, low latency pub-sub messaging s...
 
What's New in Apache Pulsar 2.9- Pulsar Summit Asia 2021
What's New in Apache Pulsar 2.9- Pulsar Summit Asia 2021What's New in Apache Pulsar 2.9- Pulsar Summit Asia 2021
What's New in Apache Pulsar 2.9- Pulsar Summit Asia 2021
 
High performance messaging with Apache Pulsar
High performance messaging with Apache PulsarHigh performance messaging with Apache Pulsar
High performance messaging with Apache Pulsar
 
Pub/Sub Messaging
Pub/Sub MessagingPub/Sub Messaging
Pub/Sub Messaging
 
Messaging With ActiveMQ
Messaging With ActiveMQMessaging With ActiveMQ
Messaging With ActiveMQ
 
Effectively-once semantics in Apache Pulsar
Effectively-once semantics in Apache PulsarEffectively-once semantics in Apache Pulsar
Effectively-once semantics in Apache Pulsar
 
Kafka basics
Kafka basicsKafka basics
Kafka basics
 
Picking a message queue
Picking a  message queuePicking a  message queue
Picking a message queue
 
Apache Kafka Introduction
Apache Kafka IntroductionApache Kafka Introduction
Apache Kafka Introduction
 
Comparing CoAP vs MQTT
Comparing CoAP vs MQTTComparing CoAP vs MQTT
Comparing CoAP vs MQTT
 
Apache kafka introduction
Apache kafka introductionApache kafka introduction
Apache kafka introduction
 
AMQP
AMQPAMQP
AMQP
 
Wso2 esb 5.0.0 product release webinar
Wso2 esb 5.0.0   product release webinarWso2 esb 5.0.0   product release webinar
Wso2 esb 5.0.0 product release webinar
 

Destacado

A sane approach to microservices
A sane approach to microservicesA sane approach to microservices
A sane approach to microservicesToby Matejovsky
 
Finagle-Based Microservices at SoundCloud
Finagle-Based Microservices at SoundCloudFinagle-Based Microservices at SoundCloud
Finagle-Based Microservices at SoundCloudPhil Calçado
 
Async Microservices with Twitter's Finagle
Async Microservices with Twitter's FinagleAsync Microservices with Twitter's Finagle
Async Microservices with Twitter's FinagleVladimir Kostyukov
 
ELK at LinkedIn - Kafka, scaling, lessons learned
ELK at LinkedIn - Kafka, scaling, lessons learnedELK at LinkedIn - Kafka, scaling, lessons learned
ELK at LinkedIn - Kafka, scaling, lessons learnedTin Le
 
Functional Programming Patterns (BuildStuff '14)
Functional Programming Patterns (BuildStuff '14)Functional Programming Patterns (BuildStuff '14)
Functional Programming Patterns (BuildStuff '14)Scott Wlaschin
 

Destacado (8)

Scala.io
Scala.ioScala.io
Scala.io
 
A sane approach to microservices
A sane approach to microservicesA sane approach to microservices
A sane approach to microservices
 
Numba Overview
Numba OverviewNumba Overview
Numba Overview
 
Finagle-Based Microservices at SoundCloud
Finagle-Based Microservices at SoundCloudFinagle-Based Microservices at SoundCloud
Finagle-Based Microservices at SoundCloud
 
Async Microservices with Twitter's Finagle
Async Microservices with Twitter's FinagleAsync Microservices with Twitter's Finagle
Async Microservices with Twitter's Finagle
 
Cyansible
CyansibleCyansible
Cyansible
 
ELK at LinkedIn - Kafka, scaling, lessons learned
ELK at LinkedIn - Kafka, scaling, lessons learnedELK at LinkedIn - Kafka, scaling, lessons learned
ELK at LinkedIn - Kafka, scaling, lessons learned
 
Functional Programming Patterns (BuildStuff '14)
Functional Programming Patterns (BuildStuff '14)Functional Programming Patterns (BuildStuff '14)
Functional Programming Patterns (BuildStuff '14)
 

Similar a Distributed & Highly Available server applications in Java and Scala

Apache Big Data Europe 2015: Selected Talks
Apache Big Data Europe 2015: Selected TalksApache Big Data Europe 2015: Selected Talks
Apache Big Data Europe 2015: Selected TalksAndrii Gakhov
 
Streaming Processing with a Distributed Commit Log
Streaming Processing with a Distributed Commit LogStreaming Processing with a Distributed Commit Log
Streaming Processing with a Distributed Commit LogJoe Stein
 
A Practical Guide To End-to-End Tracing In Event Driven Architectures
A Practical Guide To End-to-End Tracing In Event Driven ArchitecturesA Practical Guide To End-to-End Tracing In Event Driven Architectures
A Practical Guide To End-to-End Tracing In Event Driven ArchitecturesHostedbyConfluent
 
New Features in Confluent Platform 6.0 / Apache Kafka 2.6
New Features in Confluent Platform 6.0 / Apache Kafka 2.6New Features in Confluent Platform 6.0 / Apache Kafka 2.6
New Features in Confluent Platform 6.0 / Apache Kafka 2.6Kai Wähner
 
What’s expected in Java 9
What’s expected in Java 9What’s expected in Java 9
What’s expected in Java 9Gal Marder
 
DEVNET-1166 Open SDN Controller APIs
DEVNET-1166	Open SDN Controller APIsDEVNET-1166	Open SDN Controller APIs
DEVNET-1166 Open SDN Controller APIsCisco DevNet
 
Talkbits service architecture and deployment
Talkbits service architecture and deploymentTalkbits service architecture and deployment
Talkbits service architecture and deploymentOpen-IT
 
Kubernetes 101
Kubernetes 101Kubernetes 101
Kubernetes 101Huy Vo
 
Kubernetes Infra 2.0
Kubernetes Infra 2.0Kubernetes Infra 2.0
Kubernetes Infra 2.0Deepak Sood
 
Spark (Structured) Streaming vs. Kafka Streams - two stream processing platfo...
Spark (Structured) Streaming vs. Kafka Streams - two stream processing platfo...Spark (Structured) Streaming vs. Kafka Streams - two stream processing platfo...
Spark (Structured) Streaming vs. Kafka Streams - two stream processing platfo...Guido Schmutz
 
Confluent REST Proxy and Schema Registry (Concepts, Architecture, Features)
Confluent REST Proxy and Schema Registry (Concepts, Architecture, Features)Confluent REST Proxy and Schema Registry (Concepts, Architecture, Features)
Confluent REST Proxy and Schema Registry (Concepts, Architecture, Features)Kai Wähner
 
What's New in .Net 4.5
What's New in .Net 4.5What's New in .Net 4.5
What's New in .Net 4.5Malam Team
 
Putting Kafka In Jail – Best Practices To Run Kafka On Kubernetes & DC/OS
Putting Kafka In Jail – Best Practices To Run Kafka On Kubernetes & DC/OSPutting Kafka In Jail – Best Practices To Run Kafka On Kubernetes & DC/OS
Putting Kafka In Jail – Best Practices To Run Kafka On Kubernetes & DC/OSLightbend
 
14th Athens Big Data Meetup - Landoop Workshop - Apache Kafka Entering The St...
14th Athens Big Data Meetup - Landoop Workshop - Apache Kafka Entering The St...14th Athens Big Data Meetup - Landoop Workshop - Apache Kafka Entering The St...
14th Athens Big Data Meetup - Landoop Workshop - Apache Kafka Entering The St...Athens Big Data
 
Cloud Architect Alliance #15: Openstack
Cloud Architect Alliance #15: OpenstackCloud Architect Alliance #15: Openstack
Cloud Architect Alliance #15: OpenstackMicrosoft
 

Similar a Distributed & Highly Available server applications in Java and Scala (20)

Java one2013
Java one2013Java one2013
Java one2013
 
Kafka Explainaton
Kafka ExplainatonKafka Explainaton
Kafka Explainaton
 
Apache Big Data Europe 2015: Selected Talks
Apache Big Data Europe 2015: Selected TalksApache Big Data Europe 2015: Selected Talks
Apache Big Data Europe 2015: Selected Talks
 
Streaming Processing with a Distributed Commit Log
Streaming Processing with a Distributed Commit LogStreaming Processing with a Distributed Commit Log
Streaming Processing with a Distributed Commit Log
 
A Practical Guide To End-to-End Tracing In Event Driven Architectures
A Practical Guide To End-to-End Tracing In Event Driven ArchitecturesA Practical Guide To End-to-End Tracing In Event Driven Architectures
A Practical Guide To End-to-End Tracing In Event Driven Architectures
 
Typesafe spark- Zalando meetup
Typesafe spark- Zalando meetupTypesafe spark- Zalando meetup
Typesafe spark- Zalando meetup
 
New Features in Confluent Platform 6.0 / Apache Kafka 2.6
New Features in Confluent Platform 6.0 / Apache Kafka 2.6New Features in Confluent Platform 6.0 / Apache Kafka 2.6
New Features in Confluent Platform 6.0 / Apache Kafka 2.6
 
What’s expected in Java 9
What’s expected in Java 9What’s expected in Java 9
What’s expected in Java 9
 
DEVNET-1166 Open SDN Controller APIs
DEVNET-1166	Open SDN Controller APIsDEVNET-1166	Open SDN Controller APIs
DEVNET-1166 Open SDN Controller APIs
 
Talkbits service architecture and deployment
Talkbits service architecture and deploymentTalkbits service architecture and deployment
Talkbits service architecture and deployment
 
Kubernetes 101
Kubernetes 101Kubernetes 101
Kubernetes 101
 
Kubernetes Infra 2.0
Kubernetes Infra 2.0Kubernetes Infra 2.0
Kubernetes Infra 2.0
 
Serverless design with Fn project
Serverless design with Fn projectServerless design with Fn project
Serverless design with Fn project
 
Spark (Structured) Streaming vs. Kafka Streams - two stream processing platfo...
Spark (Structured) Streaming vs. Kafka Streams - two stream processing platfo...Spark (Structured) Streaming vs. Kafka Streams - two stream processing platfo...
Spark (Structured) Streaming vs. Kafka Streams - two stream processing platfo...
 
Confluent REST Proxy and Schema Registry (Concepts, Architecture, Features)
Confluent REST Proxy and Schema Registry (Concepts, Architecture, Features)Confluent REST Proxy and Schema Registry (Concepts, Architecture, Features)
Confluent REST Proxy and Schema Registry (Concepts, Architecture, Features)
 
What's New in .Net 4.5
What's New in .Net 4.5What's New in .Net 4.5
What's New in .Net 4.5
 
Envoy and Kafka
Envoy and KafkaEnvoy and Kafka
Envoy and Kafka
 
Putting Kafka In Jail – Best Practices To Run Kafka On Kubernetes & DC/OS
Putting Kafka In Jail – Best Practices To Run Kafka On Kubernetes & DC/OSPutting Kafka In Jail – Best Practices To Run Kafka On Kubernetes & DC/OS
Putting Kafka In Jail – Best Practices To Run Kafka On Kubernetes & DC/OS
 
14th Athens Big Data Meetup - Landoop Workshop - Apache Kafka Entering The St...
14th Athens Big Data Meetup - Landoop Workshop - Apache Kafka Entering The St...14th Athens Big Data Meetup - Landoop Workshop - Apache Kafka Entering The St...
14th Athens Big Data Meetup - Landoop Workshop - Apache Kafka Entering The St...
 
Cloud Architect Alliance #15: Openstack
Cloud Architect Alliance #15: OpenstackCloud Architect Alliance #15: Openstack
Cloud Architect Alliance #15: Openstack
 

Último

Exploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone ProcessorsExploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone Processorsdebabhi2
 
Deploy with confidence: VMware Cloud Foundation 5.1 on next gen Dell PowerEdg...
Deploy with confidence: VMware Cloud Foundation 5.1 on next gen Dell PowerEdg...Deploy with confidence: VMware Cloud Foundation 5.1 on next gen Dell PowerEdg...
Deploy with confidence: VMware Cloud Foundation 5.1 on next gen Dell PowerEdg...Principled Technologies
 
Boost PC performance: How more available memory can improve productivity
Boost PC performance: How more available memory can improve productivityBoost PC performance: How more available memory can improve productivity
Boost PC performance: How more available memory can improve productivityPrincipled Technologies
 
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers:  A Deep Dive into Serverless Spatial Data and FMECloud Frontiers:  A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FMESafe Software
 
TrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
TrustArc Webinar - Unlock the Power of AI-Driven Data DiscoveryTrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
TrustArc Webinar - Unlock the Power of AI-Driven Data DiscoveryTrustArc
 
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...DianaGray10
 
TrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
TrustArc Webinar - Stay Ahead of US State Data Privacy Law DevelopmentsTrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
TrustArc Webinar - Stay Ahead of US State Data Privacy Law DevelopmentsTrustArc
 
A Year of the Servo Reboot: Where Are We Now?
A Year of the Servo Reboot: Where Are We Now?A Year of the Servo Reboot: Where Are We Now?
A Year of the Servo Reboot: Where Are We Now?Igalia
 
Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024The Digital Insurer
 
Workshop - Best of Both Worlds_ Combine KG and Vector search for enhanced R...
Workshop - Best of Both Worlds_ Combine  KG and Vector search for  enhanced R...Workshop - Best of Both Worlds_ Combine  KG and Vector search for  enhanced R...
Workshop - Best of Both Worlds_ Combine KG and Vector search for enhanced R...Neo4j
 
A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)Gabriella Davis
 
How to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerHow to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerThousandEyes
 
Scaling API-first – The story of a global engineering organization
Scaling API-first – The story of a global engineering organizationScaling API-first – The story of a global engineering organization
Scaling API-first – The story of a global engineering organizationRadu Cotescu
 
Artificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and MythsArtificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and MythsJoaquim Jorge
 
Top 5 Benefits OF Using Muvi Live Paywall For Live Streams
Top 5 Benefits OF Using Muvi Live Paywall For Live StreamsTop 5 Benefits OF Using Muvi Live Paywall For Live Streams
Top 5 Benefits OF Using Muvi Live Paywall For Live StreamsRoshan Dwivedi
 
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...Miguel Araújo
 
Tata AIG General Insurance Company - Insurer Innovation Award 2024
Tata AIG General Insurance Company - Insurer Innovation Award 2024Tata AIG General Insurance Company - Insurer Innovation Award 2024
Tata AIG General Insurance Company - Insurer Innovation Award 2024The Digital Insurer
 
Automating Google Workspace (GWS) & more with Apps Script
Automating Google Workspace (GWS) & more with Apps ScriptAutomating Google Workspace (GWS) & more with Apps Script
Automating Google Workspace (GWS) & more with Apps Scriptwesley chun
 
The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024Rafal Los
 
MINDCTI Revenue Release Quarter One 2024
MINDCTI Revenue Release Quarter One 2024MINDCTI Revenue Release Quarter One 2024
MINDCTI Revenue Release Quarter One 2024MIND CTI
 

Último (20)

Exploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone ProcessorsExploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone Processors
 
Deploy with confidence: VMware Cloud Foundation 5.1 on next gen Dell PowerEdg...
Deploy with confidence: VMware Cloud Foundation 5.1 on next gen Dell PowerEdg...Deploy with confidence: VMware Cloud Foundation 5.1 on next gen Dell PowerEdg...
Deploy with confidence: VMware Cloud Foundation 5.1 on next gen Dell PowerEdg...
 
Boost PC performance: How more available memory can improve productivity
Boost PC performance: How more available memory can improve productivityBoost PC performance: How more available memory can improve productivity
Boost PC performance: How more available memory can improve productivity
 
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers:  A Deep Dive into Serverless Spatial Data and FMECloud Frontiers:  A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
 
TrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
TrustArc Webinar - Unlock the Power of AI-Driven Data DiscoveryTrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
TrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
 
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
 
TrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
TrustArc Webinar - Stay Ahead of US State Data Privacy Law DevelopmentsTrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
TrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
 
A Year of the Servo Reboot: Where Are We Now?
A Year of the Servo Reboot: Where Are We Now?A Year of the Servo Reboot: Where Are We Now?
A Year of the Servo Reboot: Where Are We Now?
 
Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024
 
Workshop - Best of Both Worlds_ Combine KG and Vector search for enhanced R...
Workshop - Best of Both Worlds_ Combine  KG and Vector search for  enhanced R...Workshop - Best of Both Worlds_ Combine  KG and Vector search for  enhanced R...
Workshop - Best of Both Worlds_ Combine KG and Vector search for enhanced R...
 
A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)
 
How to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerHow to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected Worker
 
Scaling API-first – The story of a global engineering organization
Scaling API-first – The story of a global engineering organizationScaling API-first – The story of a global engineering organization
Scaling API-first – The story of a global engineering organization
 
Artificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and MythsArtificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and Myths
 
Top 5 Benefits OF Using Muvi Live Paywall For Live Streams
Top 5 Benefits OF Using Muvi Live Paywall For Live StreamsTop 5 Benefits OF Using Muvi Live Paywall For Live Streams
Top 5 Benefits OF Using Muvi Live Paywall For Live Streams
 
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
 
Tata AIG General Insurance Company - Insurer Innovation Award 2024
Tata AIG General Insurance Company - Insurer Innovation Award 2024Tata AIG General Insurance Company - Insurer Innovation Award 2024
Tata AIG General Insurance Company - Insurer Innovation Award 2024
 
Automating Google Workspace (GWS) & more with Apps Script
Automating Google Workspace (GWS) & more with Apps ScriptAutomating Google Workspace (GWS) & more with Apps Script
Automating Google Workspace (GWS) & more with Apps Script
 
The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024
 
MINDCTI Revenue Release Quarter One 2024
MINDCTI Revenue Release Quarter One 2024MINDCTI Revenue Release Quarter One 2024
MINDCTI Revenue Release Quarter One 2024
 

Distributed & Highly Available server applications in Java and Scala

  • 1. Distributed & highly available server applications in Java and Scala Max Alexejev, Aleksei Kornev JavaOne Moscow 2013 24 April 2013
  • 4. Lightweight SOA Key principles •S1, S2 - edge services •Each service is 0..1 servers and 0..N clients built together •No special "broker" services •All services are stateless •All instances are equal What about state? State is kept is specialized distributed systems and fronted by specific services. Example follows...
  • 5. Case study: Talkbits backend Recursive call
  • 6. Requirements for a distrubuted RPC system Must have and nice to have •Elastic and reliable discovery - schould handle nodes brought up and shut down transparently and not be a SPOF itself •Support for N-N topology of client and server instances •Disconnect detection and transparent reconnects •Fault tolerance - for example, by retries to remaining instances where called instance goes down •Clients backoff built-in - i.e., clients should not overload servers when load spikes - as far as possible •Configurable load distribution - i.e., which server instance to call for this specific request •Configurable networking layer - keepalives & heartbeats, timeouts, connection pools etc.) •Distributed tracing facilities •Portability among different platforms •Distributed stack traces for exceptions •Transactions
  • 7. Key principles to be lightweight and get rid of architectural waste •Java SE •No containers. Even servlet containers are light and built-in •Standalone applications: unified configuration, deployment, metrics, logging, single development framework - more on this later •All launched istances are equal and process requests - no "special" nodes or "active-standby" patterns •Minimal dependencies and JAR size •Minimal memory footprint •One service - one purpose •Highly tuned for this one purpose (app, JVM, OS, HW) •Isolated fault domains - i.e., single datasource or external service is fronted by one service only No bloatware in technology stack! "Lean" services
  • 8. Finagle library (twitter.github.io/finagle) acts as a distributed RPC framework. Services are written in Java and Scala and use Thrift communication protocol. Talkbits implementation choices Apache Zookeeper (zookeeper.apache.org) Provides reliable service discovery mechanics. Finagle has a nice built-in integration with Zookeeper.
  • 9. Finagle server: networking Finagle is built on top of Netty - asynchronous, non-blocking TCP server. Finagle codec trait Codec[Req, Rep] class ThriftClientFramedCodec(...) extends Codec[ThriftClientRequest, Array[Byte]] { pipeline.addLast("thriftFrameCodec", new ThriftFrameCodec) pipeline.addLast("byteEncoder", new ThriftClientChannelBufferEncoder) pipeline.addLast("byteDecoder", new ThriftChannelBufferDecoder) ... } Finagle comes with ready-made codecs for Thrift, HTTP, Memcache, Kestrel, HTTP streaming.
  • 10. Finagle services and filters // Service is simply a function from request to a future of response. trait Service[Req, Rep] extends (Req => Future[Rep]) // Filter[A, B, C, D] converts a Service[C, D] to a Service[A, B]. abstract class Filter[-ReqIn, +RepOut, +ReqOut, -RepIn] extends ((ReqIn, Service[ReqOut, RepIn]) => Future[RepOut]) abstract class SimpleFilter[Req, Rep] extends Filter[Req, Rep, Req, Rep] // Service transformation example val serviceWithTimeout: Service[Req, Rep] = new RetryFilter[Req, Rep](..) andThen new TimeoutFilter[Req, Rep](..) andThen service Finagle comes with rate limiting, retries, statistics, tracing, uncaught exceptions handling, timeouts and more.
  • 11. Functional composition Given Future[A] Sequential composition def map[B](f: A => B): Future[B] def flatMap[B](f: A => Future[B]): Future[B] def rescue[B >: A](rescueException: PartialFunction[Throwable, Future[B]]): Future[B] Concurrent composition def collect[A](fs: Seq[Future[A]]): Future[Seq[A]] def select[A](fs: Seq[Future[A]]): Future[(Try[A], Seq[Future[A]])] And more
  • 12. Functional composition on RPC calls Sequential composition val nearestChannel: Future[Channel] = metadataClient.getUserById(uuid) flatMap { user => geolocationClient.getNearestChannelId( user.getLocation() ) } flatMap { channelId => metadataClient.getChannelById( channelId ) } Concurrent composition val userA: Future[User] = metadataClient.getUserById(“a”) val userB: Future[User] = metadataClient.getUserById(“b”) val userC: Future[User] = metadataClient.getUserById(“c”) val users = Future.collect(Seq(userA, userB, userC)).get() *All this stuff works in Java just like in Scala, but does not look as cool.
  • 13. Finagle server: threading model You should never block worker threads in order to achieve high performance (throughput). For blocking IO or long compuntations, delegate to FuturePool. val diskIoFuturePool = FuturePool(Executors.newFixedThreadPool(4)) diskIoFuturePool( { scala.Source.fromFile(..) } ) Boss thread accepts new client connections and binds NIO Channel to a specific worker thread. Worker threads perform all client IO.
  • 14. More gifts and bonuses from Finagle In addition to all said before, Finagle has •Load-distribution in N-N topos - HeapBalancer ("least active connections") by default •Client backoff strategies - comes with TruncatedBinaryBackoff implementation •Failure detection •Failover/Retry •Connection Pooling •Distributed Tracing (Zipkin project based on Google Dapper paper)
  • 15. Finagle, Thrift & Java: lessons learned Pros •Gives a lot out of the box •Production-proven and stable •Active development community •Lots of extension points in the library Cons •Good for Scala, usable with Java •Works well with Thrift and HTTP (plus trivial protocols), but lacks support for Protobuf and other stuff •Poor exceptions handling experience with Java (no Scala match-es) and ugly code •finagle-thrift is a pain (old libthrift version lock-in, Cassandra dependencies clash, cannot return nulls, and more). All problems avoidable thought. •Cluster scatters and never gathers when whole Zookeeper ensemble is
  • 16. Finagle: competitors & alternatives Trending •Akka 2.0 (Scala, OpenSource) by Typesafe •ZeroRPC (Python & Node.js, OpenSource) by DotCloud •RxJava (Java, OpenSource) by Netflix Old •JGroups (Java, OpenSource) •JBOSS Remoting (Java, OpenSource) by JBOSS •Spread Toolkit (C/C++, Commercial & OpenSource)
  • 17. Configuration, deployment, monitoring and logging by Aleksei Kornev
  • 20. Architecture of talkbits service One way to configure service, logs, metrics. One way to package and deploy service. One way to lunch service. Bundled in one-jar.
  • 21. One delivery unit. Contains: Java service In a single executable fat-jar. Installation script [Re]installs service on the machine, registers it in /etc/init.d Init.d script Contains instructions to start, stop, Delivery
  • 22. Logging Confuguration •SLF4J as an API, all other libraries redirected •Logback as a logging implementation •Each service logs to /var/log/talkbits/... (application logs, GC logs) •Daily rotation policy applied •Also sent to loggly.com for aggregation, grouping etc. Aggregation •loggly.com •sshfs for analyzing logs by means of linux tools such as grep, tail, less, etc. Aggregation alternatives Splunk.com, Flume, Scribe, etc...
  • 23. Metrics Application metrics and health checks are implemented with CodaHale lib (metrics.codahale.com). Codahale reports metrics via JMX. Jolokia JVM agent (www.jolokia.org/agent/jvm.html) exposes JMX beans via REST (JSON / HTTP), using JVMs internal HTTP server. Monitoring agent use jolokia REST interface to fetch metrics and send them to monitoring system. All metrics are divided into common metrics (HW, JVM, etc) and service- specific metrics.
  • 24. Deployment Fabric (http://fabfile.org) used for environments provisioning and services deployment. Process •Fabric script provisions new env (or uses existing) by cluster scheme •Amazon instances are automatically tagged with services list (i.e., instance roles) •Fabric script reads instance roles and deploys (redeploys) appropriate components.
  • 25. Monitoring As monitoring platform we chose Datadoghq.com. Datadog is a SaaS which is easy to integrate into your infrastucture. Datadog agent is opensourced and implemented in Python. There are many predefined checksets (plugins, or integrations) for popular products out of the box - including JVM, Cassandra, Zookeeper and ElasticSearch. Datadog provides REST API. Alternatives •Nagios, Zabbix - need to have bearded admin in team. We wanted to go SaaS and outsource infrastructure as far as possible. •Amazon CloudWatch, LogicMonitor, ManageEngine, etc. Process Each service has own monitoring agent instance on a single machine. If node has 'monitoring-agent' role in the roles tag of EC2 instance, monitoring agent will be installed for each service on this node.

Notas del editor

  1. Service is 0..1 RPC server and 0..N RPC clients built together No special "broker" nodes Services are all stateless. +Write something about state
  2. Title (max. 1 lines) Shape Size: 2,7cm x 23,5cm / no outer line Position: horizontal 0,6cm / vertical 1cm Alignment: top left corner Text Font: Helvetica Neue Bold, 40pt, single spacing RGB: 255 / 153 / 51 Alignment: left No autofit (text-form) 2. Text Shape (don ’ t meet the white space of the logo at the bottom of the slide!) Size: 13cm x 23,5cm / no outer line Position: horizontal 0,6cm / vertical 4,04cm Alignment: top left corner Font (regular) Font: Helvetica Neue Regular, 20pt, single spacing RGB: 53 / 53 / 53 Alignment: left Paragraph spacing: after 4,8pt / 12pt Font (bold) Font: Helvetica Neue Bold, 20pt, single spacing RGB: 53 / 53 / 53 Alignment: left Paragraph spacing: after 4,8pt / 12pt Font (highlight) Font: Helvetica Neue Bold, 20pt, single spacing RGB: 0 / 153 / 153 Alignment: left Paragraph spacing: after 4,8pt / 12pt No autofit (text-form) LOGO (make sure that no text meets the white space on the left side of the logo!) Size: 1cm x 4cm Position: horizontal: 21,06cm / vertical: 17,3cm
  3. Title (max. 1 lines) Shape Size: 2,7cm x 23,5cm / no outer line Position: horizontal 0,6cm / vertical 1cm Alignment: top left corner Text Font: Helvetica Neue Bold, 40pt, single spacing RGB: 255 / 153 / 51 Alignment: left No autofit (text-form) 2. Text Shape (don ’ t meet the white space of the logo at the bottom of the slide!) Size: 13cm x 23,5cm / no outer line Position: horizontal 0,6cm / vertical 4,04cm Alignment: top left corner Font (regular) Font: Helvetica Neue Regular, 20pt, single spacing RGB: 53 / 53 / 53 Alignment: left Paragraph spacing: after 4,8pt / 12pt Font (bold) Font: Helvetica Neue Bold, 20pt, single spacing RGB: 53 / 53 / 53 Alignment: left Paragraph spacing: after 4,8pt / 12pt Font (highlight) Font: Helvetica Neue Bold, 20pt, single spacing RGB: 0 / 153 / 153 Alignment: left Paragraph spacing: after 4,8pt / 12pt No autofit (text-form) LOGO (make sure that no text meets the white space on the left side of the logo!) Size: 1cm x 4cm Position: horizontal: 21,06cm / vertical: 17,3cm
  4. Title (max. 1 lines) Shape Size: 2,7cm x 23,5cm / no outer line Position: horizontal 0,6cm / vertical 1cm Alignment: top left corner Text Font: Helvetica Neue Bold, 40pt, single spacing RGB: 255 / 153 / 51 Alignment: left No autofit (text-form) 2. Text Shape (don ’ t meet the white space of the logo at the bottom of the slide!) Size: 13cm x 23,5cm / no outer line Position: horizontal 0,6cm / vertical 4,04cm Alignment: top left corner Font (regular) Font: Helvetica Neue Regular, 20pt, single spacing RGB: 53 / 53 / 53 Alignment: left Paragraph spacing: after 4,8pt / 12pt Font (bold) Font: Helvetica Neue Bold, 20pt, single spacing RGB: 53 / 53 / 53 Alignment: left Paragraph spacing: after 4,8pt / 12pt Font (highlight) Font: Helvetica Neue Bold, 20pt, single spacing RGB: 0 / 153 / 153 Alignment: left Paragraph spacing: after 4,8pt / 12pt No autofit (text-form) LOGO (make sure that no text meets the white space on the left side of the logo!) Size: 1cm x 4cm Position: horizontal: 21,06cm / vertical: 17,3cm
  5. Title (max. 1 lines) Shape Size: 2,7cm x 23,5cm / no outer line Position: horizontal 0,6cm / vertical 1cm Alignment: top left corner Text Font: Helvetica Neue Bold, 40pt, single spacing RGB: 255 / 153 / 51 Alignment: left No autofit (text-form) 2. Text Shape (don ’ t meet the white space of the logo at the bottom of the slide!) Size: 13cm x 23,5cm / no outer line Position: horizontal 0,6cm / vertical 4,04cm Alignment: top left corner Font (regular) Font: Helvetica Neue Regular, 20pt, single spacing RGB: 53 / 53 / 53 Alignment: left Paragraph spacing: after 4,8pt / 12pt Font (bold) Font: Helvetica Neue Bold, 20pt, single spacing RGB: 53 / 53 / 53 Alignment: left Paragraph spacing: after 4,8pt / 12pt Font (highlight) Font: Helvetica Neue Bold, 20pt, single spacing RGB: 0 / 153 / 153 Alignment: left Paragraph spacing: after 4,8pt / 12pt No autofit (text-form) LOGO (make sure that no text meets the white space on the left side of the logo!) Size: 1cm x 4cm Position: horizontal: 21,06cm / vertical: 17,3cm
  6. Title (max. 1 lines) Shape Size: 2,7cm x 23,5cm / no outer line Position: horizontal 0,6cm / vertical 1cm Alignment: top left corner Text Font: Helvetica Neue Bold, 40pt, single spacing RGB: 255 / 153 / 51 Alignment: left No autofit (text-form) 2. Text Shape (don ’ t meet the white space of the logo at the bottom of the slide!) Size: 13cm x 23,5cm / no outer line Position: horizontal 0,6cm / vertical 4,04cm Alignment: top left corner Font (regular) Font: Helvetica Neue Regular, 20pt, single spacing RGB: 53 / 53 / 53 Alignment: left Paragraph spacing: after 4,8pt / 12pt Font (bold) Font: Helvetica Neue Bold, 20pt, single spacing RGB: 53 / 53 / 53 Alignment: left Paragraph spacing: after 4,8pt / 12pt Font (highlight) Font: Helvetica Neue Bold, 20pt, single spacing RGB: 0 / 153 / 153 Alignment: left Paragraph spacing: after 4,8pt / 12pt No autofit (text-form) LOGO (make sure that no text meets the white space on the left side of the logo!) Size: 1cm x 4cm Position: horizontal: 21,06cm / vertical: 17,3cm
  7. Title (max. 1 lines) Shape Size: 2,7cm x 23,5cm / no outer line Position: horizontal 0,6cm / vertical 1cm Alignment: top left corner Text Font: Helvetica Neue Bold, 40pt, single spacing RGB: 255 / 153 / 51 Alignment: left No autofit (text-form) 2. Text Shape (don ’ t meet the white space of the logo at the bottom of the slide!) Size: 13cm x 23,5cm / no outer line Position: horizontal 0,6cm / vertical 4,04cm Alignment: top left corner Font (regular) Font: Helvetica Neue Regular, 20pt, single spacing RGB: 53 / 53 / 53 Alignment: left Paragraph spacing: after 4,8pt / 12pt Font (bold) Font: Helvetica Neue Bold, 20pt, single spacing RGB: 53 / 53 / 53 Alignment: left Paragraph spacing: after 4,8pt / 12pt Font (highlight) Font: Helvetica Neue Bold, 20pt, single spacing RGB: 0 / 153 / 153 Alignment: left Paragraph spacing: after 4,8pt / 12pt No autofit (text-form) LOGO (make sure that no text meets the white space on the left side of the logo!) Size: 1cm x 4cm Position: horizontal: 21,06cm / vertical: 17,3cm
  8. Title (max. 1 lines) Shape Size: 2,7cm x 23,5cm / no outer line Position: horizontal 0,6cm / vertical 1cm Alignment: top left corner Text Font: Helvetica Neue Bold, 40pt, single spacing RGB: 255 / 153 / 51 Alignment: left No autofit (text-form) 2. Text Shape (don ’ t meet the white space of the logo at the bottom of the slide!) Size: 13cm x 23,5cm / no outer line Position: horizontal 0,6cm / vertical 4,04cm Alignment: top left corner Font (regular) Font: Helvetica Neue Regular, 20pt, single spacing RGB: 53 / 53 / 53 Alignment: left Paragraph spacing: after 4,8pt / 12pt Font (bold) Font: Helvetica Neue Bold, 20pt, single spacing RGB: 53 / 53 / 53 Alignment: left Paragraph spacing: after 4,8pt / 12pt Font (highlight) Font: Helvetica Neue Bold, 20pt, single spacing RGB: 0 / 153 / 153 Alignment: left Paragraph spacing: after 4,8pt / 12pt No autofit (text-form) LOGO (make sure that no text meets the white space on the left side of the logo!) Size: 1cm x 4cm Position: horizontal: 21,06cm / vertical: 17,3cm
  9. Title (max. 1 lines) Shape Size: 2,7cm x 23,5cm / no outer line Position: horizontal 0,6cm / vertical 1cm Alignment: top left corner Text Font: Helvetica Neue Bold, 40pt, single spacing RGB: 255 / 153 / 51 Alignment: left No autofit (text-form) 2. Text (left) Shape (don ’ t meet the white space of the logo at the bottom of the slide!) Size: 13cm x 12cm / no outer line Position: horizontal 0,6cm / vertical 4,04cm Alignment: top left corner Font (regular) Font: Helvetica Neue Regular, 20pt, single spacing RGB: 53 / 53 / 53 Alignment: left Paragraph spacing: after 4,8pt / 12pt Font (bold) Font: Helvetica Neue Bold, 20pt, single spacing RGB: 53 / 53 / 53 Alignment: left Paragraph spacing: after 4,8pt / 12pt Font (highlight) Font: Helvetica Neue Bold, 20pt, single spacing RGB: 0 / 153 / 153 Alignment: left Paragraph spacing: after 4,8pt / 12pt No autofit (text-form) 3. Picture (right) Size: 12,96cm x 12cm, no outer line Position: horizontal 13cm / vertical 4,04cm LOGO (make sure that no text meets the white space on the left side of the logo!) Size: 1cm x 4cm Position: horizontal: 21,06cm / vertical: 17,3cm
  10. Title (max. 1 lines) Shape Size: 2,7cm x 23,5cm / no outer line Position: horizontal 0,6cm / vertical 1cm Alignment: top left corner Text Font: Helvetica Neue Bold, 40pt, single spacing RGB: 255 / 153 / 51 Alignment: left No autofit (text-form) 2. Text (left) Shape (don ’ t meet the white space of the logo at the bottom of the slide!) Size: 13cm x 12cm / no outer line Position: horizontal 0,6cm / vertical 4,04cm Alignment: top left corner Font (regular) Font: Helvetica Neue Regular, 20pt, single spacing RGB: 53 / 53 / 53 Alignment: left Paragraph spacing: after 4,8pt / 12pt Font (bold) Font: Helvetica Neue Bold, 20pt, single spacing RGB: 53 / 53 / 53 Alignment: left Paragraph spacing: after 4,8pt / 12pt Font (highlight) Font: Helvetica Neue Bold, 20pt, single spacing RGB: 0 / 153 / 153 Alignment: left Paragraph spacing: after 4,8pt / 12pt No autofit (text-form) 3. Picture (right) Size: 12,96cm x 12cm, no outer line Position: horizontal 13cm / vertical 4,04cm LOGO (make sure that no text meets the white space on the left side of the logo!) Size: 1cm x 4cm Position: horizontal: 21,06cm / vertical: 17,3cm
  11. Title (max. 1 lines) Shape Size: 2,7cm x 23,5cm / no outer line Position: horizontal 0,6cm / vertical 1cm Alignment: top left corner Text Font: Helvetica Neue Bold, 40pt, single spacing RGB: 255 / 153 / 51 Alignment: left No autofit (text-form) 2. Text Shape (don ’ t meet the white space of the logo at the bottom of the slide!) Size: 13cm x 23,5cm / no outer line Position: horizontal 0,6cm / vertical 4,04cm Alignment: top left corner Font (regular) Font: Helvetica Neue Regular, 20pt, single spacing RGB: 53 / 53 / 53 Alignment: left Paragraph spacing: after 4,8pt / 12pt Font (bold) Font: Helvetica Neue Bold, 20pt, single spacing RGB: 53 / 53 / 53 Alignment: left Paragraph spacing: after 4,8pt / 12pt Font (highlight) Font: Helvetica Neue Bold, 20pt, single spacing RGB: 0 / 153 / 153 Alignment: left Paragraph spacing: after 4,8pt / 12pt No autofit (text-form) LOGO (make sure that no text meets the white space on the left side of the logo!) Size: 1cm x 4cm Position: horizontal: 21,06cm / vertical: 17,3cm
  12. Title (max. 1 lines) Shape Size: 2,7cm x 23,5cm / no outer line Position: horizontal 0,6cm / vertical 1cm Alignment: top left corner Text Font: Helvetica Neue Bold, 40pt, single spacing RGB: 255 / 153 / 51 Alignment: left No autofit (text-form) 2. Text Shape (don ’ t meet the white space of the logo at the bottom of the slide!) Size: 13cm x 23,5cm / no outer line Position: horizontal 0,6cm / vertical 4,04cm Alignment: top left corner Font (regular) Font: Helvetica Neue Regular, 20pt, single spacing RGB: 53 / 53 / 53 Alignment: left Paragraph spacing: after 4,8pt / 12pt Font (bold) Font: Helvetica Neue Bold, 20pt, single spacing RGB: 53 / 53 / 53 Alignment: left Paragraph spacing: after 4,8pt / 12pt Font (highlight) Font: Helvetica Neue Bold, 20pt, single spacing RGB: 0 / 153 / 153 Alignment: left Paragraph spacing: after 4,8pt / 12pt No autofit (text-form) LOGO (make sure that no text meets the white space on the left side of the logo!) Size: 1cm x 4cm Position: horizontal: 21,06cm / vertical: 17,3cm
  13. Title (max. 1 lines) Shape Size: 2,7cm x 23,5cm / no outer line Position: horizontal 0,6cm / vertical 1cm Alignment: top left corner Text Font: Helvetica Neue Bold, 40pt, single spacing RGB: 255 / 153 / 51 Alignment: left No autofit (text-form) 2. Text Shape (don ’ t meet the white space of the logo at the bottom of the slide!) Size: 13cm x 23,5cm / no outer line Position: horizontal 0,6cm / vertical 4,04cm Alignment: top left corner Font (regular) Font: Helvetica Neue Regular, 20pt, single spacing RGB: 53 / 53 / 53 Alignment: left Paragraph spacing: after 4,8pt / 12pt Font (bold) Font: Helvetica Neue Bold, 20pt, single spacing RGB: 53 / 53 / 53 Alignment: left Paragraph spacing: after 4,8pt / 12pt Font (highlight) Font: Helvetica Neue Bold, 20pt, single spacing RGB: 0 / 153 / 153 Alignment: left Paragraph spacing: after 4,8pt / 12pt No autofit (text-form) LOGO (make sure that no text meets the white space on the left side of the logo!) Size: 1cm x 4cm Position: horizontal: 21,06cm / vertical: 17,3cm
  14. Title (max. 1 lines) Shape Size: 2,7cm x 23,5cm / no outer line Position: horizontal 0,6cm / vertical 1cm Alignment: top left corner Text Font: Helvetica Neue Bold, 40pt, single spacing RGB: 255 / 153 / 51 Alignment: left No autofit (text-form) 2. Text Shape (don ’ t meet the white space of the logo at the bottom of the slide!) Size: 13cm x 23,5cm / no outer line Position: horizontal 0,6cm / vertical 4,04cm Alignment: top left corner Font (regular) Font: Helvetica Neue Regular, 20pt, single spacing RGB: 53 / 53 / 53 Alignment: left Paragraph spacing: after 4,8pt / 12pt Font (bold) Font: Helvetica Neue Bold, 20pt, single spacing RGB: 53 / 53 / 53 Alignment: left Paragraph spacing: after 4,8pt / 12pt Font (highlight) Font: Helvetica Neue Bold, 20pt, single spacing RGB: 0 / 153 / 153 Alignment: left Paragraph spacing: after 4,8pt / 12pt No autofit (text-form) LOGO (make sure that no text meets the white space on the left side of the logo!) Size: 1cm x 4cm Position: horizontal: 21,06cm / vertical: 17,3cm
  15. Title (max. 1 lines) Shape Size: 2,7cm x 23,5cm / no outer line Position: horizontal 0,6cm / vertical 1cm Alignment: top left corner Text Font: Helvetica Neue Bold, 40pt, single spacing RGB: 255 / 153 / 51 Alignment: left No autofit (text-form) 2. Text Shape (don ’ t meet the white space of the logo at the bottom of the slide!) Size: 13cm x 23,5cm / no outer line Position: horizontal 0,6cm / vertical 4,04cm Alignment: top left corner Font (regular) Font: Helvetica Neue Regular, 20pt, single spacing RGB: 53 / 53 / 53 Alignment: left Paragraph spacing: after 4,8pt / 12pt Font (bold) Font: Helvetica Neue Bold, 20pt, single spacing RGB: 53 / 53 / 53 Alignment: left Paragraph spacing: after 4,8pt / 12pt Font (highlight) Font: Helvetica Neue Bold, 20pt, single spacing RGB: 0 / 153 / 153 Alignment: left Paragraph spacing: after 4,8pt / 12pt No autofit (text-form) LOGO (make sure that no text meets the white space on the left side of the logo!) Size: 1cm x 4cm Position: horizontal: 21,06cm / vertical: 17,3cm