The Ultimate Dependency Manager Shootout Xander Uiterlinden - - PowerPoint PPT Presentation

the ultimate dependency manager shootout
SMART_READER_LITE
LIVE PREVIEW

The Ultimate Dependency Manager Shootout Xander Uiterlinden - - PowerPoint PPT Presentation

The Ultimate Dependency Manager Shootout Xander Uiterlinden @uiterlix Sander Mak @sander_mak Luminis Technologies Who we are S ander Mak http://branchandbound.net @sander_mak X ander Uiterlinden http://blog.uiterlinden.nl @uiterlix


slide-1
SLIDE 1

Xander Uiterlinden Sander Mak

  • Luminis Technologies

@uiterlix @sander_mak

The Ultimate Dependency Manager Shootout

slide-2
SLIDE 2

@uiterlix @sander_mak

Who we are

Sander Mak http://branchandbound.net @sander_mak http://blog.uiterlinden.nl @uiterlix Xander Uiterlinden

slide-3
SLIDE 3

@uiterlix @sander_mak

Agenda

OSGi Services Dependency Managers Comparison Overview/community Code Performance Conclusion

slide-4
SLIDE 4

OSGi Services

slide-5
SLIDE 5

@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

slide-6
SLIDE 6

@uiterlix @sander_mak

register OSGi Service Registry Provider Bundle

api.MyService impl.MyServiceImpl

Consumer Bundle lookup

  • nly api package dependency

Decoupling through interfaces Inversion of Control Service dynamics

OSGi Services

slide-7
SLIDE 7

Dependency Managers

slide-8
SLIDE 8

@uiterlix @sander_mak

Why Dependency Managers?

slide-9
SLIDE 9

@uiterlix @sander_mak

Why Dependency Managers?

Cut down the boilerplate Decouple from OSGi APIs Dependency Injection Testability Component models Aspects Adapters Etc.

Components…?

  • rg.apache.felix.ipojo.annotations.Component
  • rg.osgi.service.component.annotations.Component

aQute.bnd.annotation.component.Component

  • rg.apache.felix.dm.annotation.api.Component
  • rg.springframework.stereotype.Component

….

  • Notions: contract-based, reactive, explicit lifecycle
slide-10
SLIDE 10

Comparison

slide-11
SLIDE 11

@uiterlix @sander_mak

The lineup

Felix Dependency Manager Felix iPojo

Implementations Compendium Specifications

Declarative Services

  • KnopflerFish
  • Equinox
  • Apache Aries

Felix Service Component Runtime Eclipse Gemini Blueprint Blueprint

slide-12
SLIDE 12

@uiterlix @sander_mak

The lineup: disclaimer

We primarily work with (and on) Felix DM

slide-13
SLIDE 13

@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

slide-14
SLIDE 14

@uiterlix @sander_mak

Felix SCR

Last release User list License March 2014 ~50 msg Apache 2.0 Open issues 25 Since 2007

slide-15
SLIDE 15

@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

slide-16
SLIDE 16

@uiterlix @sander_mak

Lots of 404s :(

Eclipse Gemini Blueprint

Last release User list License August 2012 ~60 msg EPL Open issues 17 Since 2009

slide-17
SLIDE 17

@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

slide-18
SLIDE 18

@uiterlix @sander_mak

Felix Dependency Manager

Last release User list License Januari 2013 ~1 msg Apache 2.0 Open issues 22 Since 2004

slide-19
SLIDE 19

@uiterlix @sander_mak

Programmatic API, XML and annotations Proxy based Bytecode manipulation

Felix iPojo

Bundle 1 Bundle 2

Component Component instance

Service

provide Component require Component instance

  • Composites: intra-bundle mechanism

Scoped service registries Pluggable handlers Additional abstractions:

slide-20
SLIDE 20

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

slide-21
SLIDE 21

Comparison: code

slide-22
SLIDE 22

@uiterlix @sander_mak

The example

http://bit.ly/dmshootout

slide-23
SLIDE 23

@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

slide-24
SLIDE 24

@uiterlix @sander_mak

Declarative Services

META-INF/MANIFEST.MF OSGI-INF/temp.xml

  • TemperatureSensor.class

Temperate Sensor Bundle

slide-25
SLIDE 25

@uiterlix @sander_mak

Declarative Services

Dashboard Bundle

slide-26
SLIDE 26

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

slide-27
SLIDE 27

@uiterlix @sander_mak

META-INF/MANIFEST.MF OSGI-INF/blueprint/temp.xml

  • TemperatureSensor.class

Temperate Sensor Bundle Bundle-Blueprint header optional

BluePrint

slide-28
SLIDE 28

@uiterlix @sander_mak

BluePrint

Dashboard Bundle snipped 10+ lines of namespaces :(

slide-29
SLIDE 29

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

slide-30
SLIDE 30

@uiterlix @sander_mak

Felix Dependency Manager

META-INF/MANIFEST.MF

  • Activator.class

TemperatureSensor.class Temperate Sensor Bundle

slide-31
SLIDE 31

@uiterlix @sander_mak

Felix Dependency Manager

Dashboard Bundle

slide-32
SLIDE 32

@uiterlix @sander_mak

Felix Dependency Manager

It’s code: dynamically create and depend

  • n 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…
slide-33
SLIDE 33

@uiterlix @sander_mak

Felix Dependency Manager

https://bitbucket.org/uiterlix/ravioli

slide-34
SLIDE 34

@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

slide-35
SLIDE 35

@uiterlix @sander_mak

Felix iPojo

slide-36
SLIDE 36

@uiterlix @sander_mak

Felix iPojo

Both ‚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

slide-37
SLIDE 37

Comparison: performance

slide-38
SLIDE 38

@uiterlix @sander_mak

Benchmarks

Don’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)

slide-39
SLIDE 39

@uiterlix @sander_mak

Benchmark scenario

  • Temperature sensors for each

postal code in the Nederlands 463860 Sensor services

  • Service properties:
  • Province
  • Municipality
  • City
  • PostalCode
slide-40
SLIDE 40

@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

slide-41
SLIDE 41

@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

slide-42
SLIDE 42

@uiterlix @sander_mak

Register services (Equinox)

ipojo DM OSGi

Duration in ms.

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

slide-43
SLIDE 43

@uiterlix @sander_mak

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 DM OSGi

slide-44
SLIDE 44

@uiterlix @sander_mak

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 DM OSGi

slide-45
SLIDE 45

@uiterlix @sander_mak

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 felix OSGi knoplerfish DM knoplerfish iPojo knoplerfish

Register services (combined)

iPojo Equinox OSGi & DM Felix iPojo Felix & Knoplerfish OSGi & DM Equinox & Knoplerfish

slide-46
SLIDE 46

@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

slide-47
SLIDE 47

@uiterlix @sander_mak

Time in millis

400 800 1200 1600 blueprint dm ds ipojo

Consuming services

Injecting 19021 services into a single consumer on Equinox

slide-48
SLIDE 48

@uiterlix @sander_mak

Time in millis

400 800 1200 1600 blueprint dm ds ipojo

injection injection and method invocation

Method invocation overhead

Injecting 19021 services into a single consumer on Equinox, and invoking a method on the injected services

slide-49
SLIDE 49

@uiterlix @sander_mak

iPojo and # of services

Time in millis

15000 30000 45000 60000

# services in service registry

50 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

iPojo

Injecting a single service into a single consumer on Equinox

slide-50
SLIDE 50

@uiterlix @sander_mak

Performance considerations

Use 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

75000 150000 225000 300000 197 2878 Default With index

slide-51
SLIDE 51

Conclusion

slide-52
SLIDE 52

@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

slide-53
SLIDE 53

@uiterlix @sander_mak

Questions?

http://bit.ly/dmshootout Code:

Sander Mak http://branchandbound.net @sander_mak http://blog.uiterlinden.nl @uiterlix Xander Uiterlinden