View
542
Download
0
Category
Preview:
DESCRIPTION
Working with micro-services is arguably the best part of OSGi development. However, everyone agrees that tracking service dependencies with the bare-bones OSGi API is not ideal. So, you pick one of the available dependency managers: either Declarative Services, Felix Dependency manager, Blueprint or iPojo. But how do you pick the right one? Easy! After this shoot-out you’ll know all about the performance, usability and other aspects of the existing dependency managers. We show the strengths and weaknesses of the implementations side-by-side. How usable is the API? What about performance, does it scale beyond trivial amounts of services? Does it matter which OSGi framework you run the dependency manager in? Make up your mind with the facts presented in this session. Bio: Xander Uiterlinden Xander Uiterlinden is a software developer working at Luminis Technologies. He has a broad experience in architecture, design and engineering of modular applications. Over the past years he as been working as a lead software architect on an enterprise grade business process application leveraging OSGi and several open source software components. He is a committer at the Apache Felix project contributing to the Apache Felix Dependency manager component and is also involved in several other smaller open source projects. Sander Mak After getting his master's degree in Software Technology, Sander became a software developer/architect. Currently he works as Senior Software Engineer for Luminis Technologies, specializing in modular Java and JavaScript development. Additionally, data analysis and machine learning are part of his ever growing list of interests. Sander loves sharing knowledge, for example through his blog (at http://branchandbound.net) and by writing for the Dutch Java Magazine. He speaks regularly at various international developer conferences (including JavaOne, J-Fall, JEEConf), sharing his passion for Java, alternative JVM languages and related technologies.
Citation preview
Xander Uiterlinden Sander Mak !
Luminis Technologies
@uiterlix @sander_mak
The Ultimate Dependency Manager Shootout
@uiterlix @sander_mak
Who we are
Sander Mak
http://branchandbound.net
@sander_mak
http://blog.uiterlinden.nl
@uiterlix
Xander Uiterlinden
@uiterlix @sander_mak
Agenda
OSGi Services Dependency Managers Comparison
Overview/community Code Performance
Conclusion
OSGi Services
@uiterlix @sander_mak
OSGi Services
Provider Bundle! api.MyService impl.MyServiceImpl
Consumer Bundle
new MyServiceImpl()
Strong coupling to implementation !
What if provider bundle not available/stops? !
What about configuration?
api + impl package dependency
@uiterlix @sander_mak
register OSGi Service Registry
Provider Bundle! api.MyService impl.MyServiceImpl
Consumer!Bundle
lookup
only api package dependency
Decoupling through interfaces Inversion of Control Service dynamics
OSGi Services
Dependency Managers
@uiterlix @sander_mak
Why Dependency Managers?
@uiterlix @sander_mak
Why Dependency Managers?
Cut down the boilerplate Decouple from OSGi APIs Dependency Injection
Testability Component models
Aspects Adapters Etc.
Components…?!!
org.apache.felix.ipojo.annotations.Component! org.osgi.service.component.annotations.Component aQute.bnd.annotation.component.Component! org.apache.felix.dm.annotation.api.Component! org.springframework.stereotype.Component! …. !Notions: contract-based, reactive, explicit lifecycle
Comparison
@uiterlix @sander_mak
The lineup
Felix Dependency
Manager
Felix iPojo
ImplementationsCompendium Specifications
Declarative Services
!!
KnopflerFish
!!
Equinox
!!
Apache Aries
Felix Service Component
Runtime
Eclipse Gemini BlueprintBlueprint
@uiterlix @sander_mak
The lineup: disclaimer
We primarily work with (and on) Felix DM
@uiterlix @sander_mak
Since R4 (2005) DS 1.1 with R4.2, DS 1.2 with R5 XML based
True POJOs Or: DS annotations to generate XML
!
Additional abstractions:ComponentContext for each component ComponentFactory: client initiates instantiation
Bundle 1
Component!Instance
Component!Description
Bundle 2
Component!Instance
Component!Description
Service
reference
provide
Declarative Services
@uiterlix @sander_mak
Felix SCR
Last release
User list
License
March 2014
~50 msg
Apache 2.0
Open issues 25
Since 2007
@uiterlix @sander_mak
Eclipse Gemini Blueprint
DM Server Gemini Blueprint
Spec since R4.2 (2009) Familiar for Spring devs Declarative: XML based
Annotations in Aries, but not in spec (or Gemini) Components proxied: ‘Dampens’ service dynamics
2009
Bundle 1
Application Context
Bundle 2
Service
reference
export
Bean
Bean
Bean
Application Context
Bean
Bean
@uiterlix @sander_mak
Lots of 404s :(
Eclipse Gemini Blueprint
Last release
User list
License
August 2012
~60 msg
EPL
Open issues 17
Since 2009
@uiterlix @sander_mak
Felix Dependency Manager
DSL for component definition in Activator Programmatic Annotation based (bnd plugin)
Embraces service dynamics
Bundle 1
Component!Instance
Bundle 2
Component!Instance
Component!Instance
Service
reference
adapt
Service’
publish
Service
aspect
Additional abstractions:Aspect: intercept and republish service Adapter: publish service with adapted interface
@uiterlix @sander_mak
Felix Dependency Manager
Last release
User list
License
Januari 2013
~1 msg
Apache 2.0
Open issues 22
Since 2004
@uiterlix @sander_mak
Programmatic API, XML and annotations Proxy based Bytecode manipulation
Felix iPojo
Bundle 1 Bundle 2
Component
Component!instance
Service
provideComponent
require
Component!instance
!
!
Composites: intra-bundle mechanism Scoped service registries Pluggable handlers
Additional abstractions:
@uiterlix @sander_mak
Felix iPojo
Last release
User list
License
March 2014
~130 msg
Apache 2.0
Open issues 30
Since 2008
Best site among DMs!
Comparison: code
@uiterlix @sander_mak
The example
http://bit.ly/dmshootout
@uiterlix @sander_mak
Extender pattern
Application bundle 1
Application bundle 2
Application bundle 3
SCR/iPojo/Blueprint/(DM!runtime) bundle
Service Registry
Some-Header: … register services
@uiterlix @sander_mak
Declarative Services
META-INF/MANIFEST.MF!OSGI-INF/temp.xml!!TemperatureSensor.class
Temperate Sensor Bundle
@uiterlix @sander_mak
Declarative Services
Dashboard Bundle
@uiterlix @sander_mak
Declarative Services
No direct field injection Defaults:
Delayed component (activate on use) Static policy -> many reactivations
!
!
!
Static Dynamic
Reluctant Do nothing Rebind optionals
Greedy Reactivate Rebind
What if ‘better’ service arrives?
@uiterlix @sander_mak
META-INF/MANIFEST.MF!OSGI-INF/blueprint/temp.xml!!TemperatureSensor.class
Temperate Sensor Bundle
Bundle-Blueprint header optional
BluePrint
@uiterlix @sander_mak
BluePrint
Dashboard Bundlesnipped 10+ lines of namespaces :(
@uiterlix @sander_mak
BluePrint!
Strong focus on intra-bundle composition Hides dynamicity (until TimeOutException…)
If dependency goes away, component is not stopped. If service is exposed, unregisters it. No lazy activation like DS Whole ‘applicationContext’ started or not
(Custom) TypeConverters Constructor/setter injection, no field injection Namespace hell :(
!
@uiterlix @sander_mak
Felix Dependency Manager
META-INF/MANIFEST.MF!!Activator.class!TemperatureSensor.class
Temperate Sensor Bundle
@uiterlix @sander_mak
Felix Dependency Manager
Dashboard Bundle
@uiterlix @sander_mak
Felix Dependency Manager
It’s code: dynamically create and depend on services Annotations available (+ bnd plugin) Field injection, NullObject pattern Manual mgmt. of list of dependencies :( Services registered eagerly from Activator Features: aspects, adapters
!DM 4 coming up…
@uiterlix @sander_mak
Felix Dependency Manager
https://bitbucket.org/uiterlix/ravioli
!
@uiterlix @sander_mak
Felix iPojo
!TemperatureSensor.class!metadata.xml!!META-INF/MANIFEST.MF!
Temperate Sensor Bundle
Generated by IDE plugin by processing annotations and metadata.xml
@uiterlix @sander_mak
Felix iPojo
@uiterlix @sander_mak
Felix iPojoBoth ‚static’ configuration and configuration using code Dependency manager with the most advanced features:
External handlers Service binding interceptors Stereotypes
Annotations limited to declaring components and ‚simple’ instances. XML recommended for declaring instances. Shell commands for component inspection
!
Comparison: performance
@uiterlix @sander_mak
BenchmarksDon’t be afraid of too many services ? Promises…
!
„Each bundle may register zero or more
services. Each bundle may also use zero or
more services. There exists no limit on the
number of services, more than the ones given
by memory limits or java security permissions.” (Knoplerfish tutorial)
@uiterlix @sander_mak
Benchmark scenario!
!
Temperature sensors for each postal code in the Nederlands 463860 Sensor services !
Service properties: - Province - Municipality - City - PostalCode
@uiterlix @sander_mak
Benchmarks
Publishing Sensor services Felix, Equinox, Knoplerfish Plain OSGi, DM, iPojo
!
Consuming Sensor services Whiteboard; all sensors in Amsterdam(&(province=Noord-Holland)(municipality=Amsterdam)) Felix, Equinox, Knoplerfish DS, DM, iPojo, Blueprint
@uiterlix @sander_mak
Disclaimer
Results are as-is, no further investigation done No optimizations done
!
You can repeat these tests yourself. Projects are available on github
http://bit.ly/dmshootout
@uiterlix @sander_mak
Register services (Equinox)
ipojo
DMOSGi
Dur
atio
n in
ms.
0
175000
350000
525000
700000
10000 30000 50000 70000 90000 110000 130000 150000 170000 190000 210000 230000 250000 270000 290000 310000 330000 350000 370000 390000 410000 430000 450000
OSGi DM iPojo
@uiterlix @sander_mak
0
50000
100000
150000
200000
250000
10000 30000 50000 70000 90000 110000 130000 150000 170000 190000 210000 230000 250000 270000 290000 310000 330000 350000 370000 390000 410000 430000 450000
OSGi DM iPojo
Register services (Felix)
iPojo
DMOSGi
@uiterlix @sander_mak
0
50000
100000
150000
200000
250000
10000 30000 50000 70000 90000 110000 130000 150000 170000 190000 210000 230000 250000 270000 290000 310000 330000 350000 370000 390000 410000 430000 450000
OSGi DM iPojo
Register services (Knoplerfish)
iPojo
DMOSGi
@uiterlix @sander_mak
0
100000
200000
300000
400000
500000
600000
700000
10000 30000 50000 70000 90000 110000 130000 150000 170000 190000 210000 230000 250000 270000 290000 310000 330000 350000 370000 390000 410000 430000 450000
OSGi equinox DM equinox iPojo equinox OSGi felix DM felix iPojo felixOSGi knoplerfish DM knoplerfish iPojo knoplerfish
Register services (combined)
iPojo Equinox
OSGi & DM Felix
iPojo Felix & Knoplerfish
OSGi & DM Equinox & Knoplerfish
@uiterlix @sander_mak
Register services
Observations Non linear results for registering services with Felix Registering services using iPojo takes considerably longer compared to plain OSGi and DM
@uiterlix @sander_mak
Tim
e in
milli
s
0
400
800
1200
1600
blueprint dm ds ipojo
Consuming servicesInjecting 19021 services into a single consumer on Equinox
@uiterlix @sander_mak
Tim
e in
milli
s
0
400
800
1200
1600
blueprint dm ds ipojo
injection injection and method invocation
Method invocation overheadInjecting 19021 services into a single consumer on Equinox,
and invoking a method on the injected services
@uiterlix @sander_mak
iPojo and # of servicesTi
me
in m
illis
0
15000
30000
45000
60000
# services in service registry50 100 150 200 250 300 350 400 450 500 550 600 650 700 750 800 850 900 950 1000 1050 1100 1150 1200 1250 1300 1350 1400 1450 1500 1550 1600
iPojoInjecting a single service into a single consumer on Equinox
@uiterlix @sander_mak
Performance considerationsUse of LDAP filters
Filter complexity, service registry scans Felix DM provides optimization though indexing service properties !
!
Bundle starting order Service tracker obtain initial versus service listener events
0
75000
150000
225000
300000
197 2878
Default With index
Conclusion
@uiterlix @sander_mak
Conclusion
Features ranging from simple to advanced (DS, Blueprint < DM < iPojo) Annotation/XML-only frameworks are easy to use but provide less dynamics Consider the expected size of your application (services, dependencies) and run some test before choosing one! You can mix & match
… but don’t do that
@uiterlix @sander_mak
Questions?http://bit.ly/dmshootoutCode:
Sander Mak
http://branchandbound.net
@sander_mak
http://blog.uiterlinden.nl
@uiterlix
Xander Uiterlinden
Recommended