the ultimate dependency manager shoot out - x uiterlinden & s mak

53
Xander Uiterlinden Sander Mak Luminis Technologies @uiterlix @sander_mak The Ultimate Dependency Manager Shootout

Upload: mfrancis

Post on 07-Dec-2014

542 views

Category:

Technology


0 download

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.

TRANSCRIPT

Page 1: The ultimate dependency manager shoot out - X Uiterlinden & S Mak

Xander Uiterlinden Sander Mak !

Luminis Technologies

@uiterlix @sander_mak

The Ultimate Dependency Manager Shootout

Page 2: The ultimate dependency manager shoot out - X Uiterlinden & S Mak

@uiterlix @sander_mak

Who we are

Sander Mak

http://branchandbound.net

@sander_mak

http://blog.uiterlinden.nl

@uiterlix

Xander Uiterlinden

Page 3: The ultimate dependency manager shoot out - X Uiterlinden & S Mak

@uiterlix @sander_mak

Agenda

OSGi Services Dependency Managers Comparison

Overview/community Code Performance

Conclusion

Page 4: The ultimate dependency manager shoot out - X Uiterlinden & S Mak

OSGi Services

Page 5: The ultimate dependency manager shoot out - X Uiterlinden & S Mak

@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

Page 6: The ultimate dependency manager shoot out - X Uiterlinden & S Mak

@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

Page 7: The ultimate dependency manager shoot out - X Uiterlinden & S Mak

Dependency Managers

Page 8: The ultimate dependency manager shoot out - X Uiterlinden & S Mak

@uiterlix @sander_mak

Why Dependency Managers?

Page 9: The ultimate dependency manager shoot out - X Uiterlinden & S Mak

@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

Page 10: The ultimate dependency manager shoot out - X Uiterlinden & S Mak

Comparison

Page 11: The ultimate dependency manager shoot out - X Uiterlinden & S Mak

@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

Page 12: The ultimate dependency manager shoot out - X Uiterlinden & S Mak

@uiterlix @sander_mak

The lineup: disclaimer

We primarily work with (and on) Felix DM

Page 13: The ultimate dependency manager shoot out - X Uiterlinden & S Mak

@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

Page 14: The ultimate dependency manager shoot out - X Uiterlinden & S Mak

@uiterlix @sander_mak

Felix SCR

Last release

User list

License

March 2014

~50 msg

Apache 2.0

Open issues 25

Since 2007

Page 15: The ultimate dependency manager shoot out - X Uiterlinden & S Mak

@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

Page 16: The ultimate dependency manager shoot out - X Uiterlinden & S Mak

@uiterlix @sander_mak

Lots of 404s :(

Eclipse Gemini Blueprint

Last release

User list

License

August 2012

~60 msg

EPL

Open issues 17

Since 2009

Page 17: The ultimate dependency manager shoot out - X Uiterlinden & S Mak

@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

Page 18: The ultimate dependency manager shoot out - X Uiterlinden & S Mak

@uiterlix @sander_mak

Felix Dependency Manager

Last release

User list

License

Januari 2013

~1 msg

Apache 2.0

Open issues 22

Since 2004

Page 19: The ultimate dependency manager shoot out - X Uiterlinden & S Mak

@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:

Page 20: The ultimate dependency manager shoot out - X Uiterlinden & S Mak

@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!

Page 21: The ultimate dependency manager shoot out - X Uiterlinden & S Mak

Comparison: code

Page 22: The ultimate dependency manager shoot out - X Uiterlinden & S Mak

@uiterlix @sander_mak

The example

http://bit.ly/dmshootout

Page 23: The ultimate dependency manager shoot out - X Uiterlinden & S Mak

@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

Page 24: The ultimate dependency manager shoot out - X Uiterlinden & S Mak

@uiterlix @sander_mak

Declarative Services

META-INF/MANIFEST.MF!OSGI-INF/temp.xml!!TemperatureSensor.class

Temperate Sensor Bundle

Page 25: The ultimate dependency manager shoot out - X Uiterlinden & S Mak

@uiterlix @sander_mak

Declarative Services

Dashboard Bundle

Page 26: The ultimate dependency manager shoot out - X Uiterlinden & S Mak

@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?

Page 27: The ultimate dependency manager shoot out - X Uiterlinden & S Mak

@uiterlix @sander_mak

META-INF/MANIFEST.MF!OSGI-INF/blueprint/temp.xml!!TemperatureSensor.class

Temperate Sensor Bundle

Bundle-Blueprint header optional

BluePrint

Page 28: The ultimate dependency manager shoot out - X Uiterlinden & S Mak

@uiterlix @sander_mak

BluePrint

Dashboard Bundlesnipped 10+ lines of namespaces :(

Page 29: The ultimate dependency manager shoot out - X Uiterlinden & S Mak

@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 :(

!

Page 30: The ultimate dependency manager shoot out - X Uiterlinden & S Mak

@uiterlix @sander_mak

Felix Dependency Manager

META-INF/MANIFEST.MF!!Activator.class!TemperatureSensor.class

Temperate Sensor Bundle

Page 31: The ultimate dependency manager shoot out - X Uiterlinden & S Mak

@uiterlix @sander_mak

Felix Dependency Manager

Dashboard Bundle

Page 32: The ultimate dependency manager shoot out - X Uiterlinden & S Mak

@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…

Page 33: The ultimate dependency manager shoot out - X Uiterlinden & S Mak

@uiterlix @sander_mak

Felix Dependency Manager

https://bitbucket.org/uiterlix/ravioli

!

Page 34: The ultimate dependency manager shoot out - X Uiterlinden & S Mak

@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

Page 35: The ultimate dependency manager shoot out - X Uiterlinden & S Mak

@uiterlix @sander_mak

Felix iPojo

Page 36: The ultimate dependency manager shoot out - X Uiterlinden & S Mak

@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

!

Page 37: The ultimate dependency manager shoot out - X Uiterlinden & S Mak

Comparison: performance

Page 38: The ultimate dependency manager shoot out - X Uiterlinden & S Mak

@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)

Page 39: The ultimate dependency manager shoot out - X Uiterlinden & S Mak

@uiterlix @sander_mak

Benchmark scenario!

!

Temperature sensors for each postal code in the Nederlands 463860 Sensor services !

Service properties: - Province - Municipality - City - PostalCode

Page 40: The ultimate dependency manager shoot out - X Uiterlinden & S Mak

@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

Page 41: The ultimate dependency manager shoot out - X Uiterlinden & S Mak

@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

Page 42: The ultimate dependency manager shoot out - X Uiterlinden & S Mak

@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

Page 43: The ultimate dependency manager shoot out - X Uiterlinden & S Mak

@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

Page 44: The ultimate dependency manager shoot out - X Uiterlinden & S Mak

@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

Page 45: The ultimate dependency manager shoot out - X Uiterlinden & S Mak

@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

Page 46: The ultimate dependency manager shoot out - X Uiterlinden & S Mak

@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

Page 47: The ultimate dependency manager shoot out - X Uiterlinden & S Mak

@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

Page 48: The ultimate dependency manager shoot out - X Uiterlinden & S Mak

@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

Page 49: The ultimate dependency manager shoot out - X Uiterlinden & S Mak

@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

Page 50: The ultimate dependency manager shoot out - X Uiterlinden & S Mak

@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

Page 51: The ultimate dependency manager shoot out - X Uiterlinden & S Mak

Conclusion

Page 52: The ultimate dependency manager shoot out - X Uiterlinden & S Mak

@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

Page 53: The ultimate dependency manager shoot out - X Uiterlinden & S Mak

@uiterlix @sander_mak

Questions?http://bit.ly/dmshootoutCode:

Sander Mak

http://branchandbound.net

@sander_mak

http://blog.uiterlinden.nl

@uiterlix

Xander Uiterlinden