47
Road Trip to Component Marketa Adamova

Road Trip To Component

Embed Size (px)

Citation preview

Page 1: Road Trip To Component

Road Trip to Component

Marketa Adamova

Page 2: Road Trip To Component

NOMNOM INSIGHTS

Page 3: Road Trip To Component

Technical challenges• Import large amounts of data in various

formats

• Process, analyse and store data

• Present data to user

• Fast search and stats on data

Page 4: Road Trip To Component
Page 5: Road Trip To Component
Page 6: Road Trip To Component

Reasons for change

• Missing NLP libraries

• Better data storage

• Performance issues

• Prototype app

Page 7: Road Trip To Component

Taking the Clojure turn

Page 8: Road Trip To Component

Why Clojure?• JVM

• Java Interop

• Concurrent processing

• Data representation

• Fun to write

Page 9: Road Trip To Component

Lukasz Korecki (CTO at NomNom)

“We moved to Clojure because of JVM and we stayed for everything else.”

Page 10: Road Trip To Component
Page 11: Road Trip To Component
Page 12: Road Trip To Component

Main road blockers

• Correct JVM setup

• Application structure

• Managing shared application state

Page 13: Road Trip To Component

How to structure Clojure application

Page 14: Road Trip To Component

Organising Clojure code

• Namespaces

• Extract code to libraries

• Protocols

Page 15: Road Trip To Component

Protocol & types

• Mechanism for abstraction

• Polymorphism

• Boundaries between subsystems

Page 16: Road Trip To Component
Page 17: Road Trip To Component
Page 18: Road Trip To Component

Handling state in Clojure

Page 19: Road Trip To Component

Mutable state• https://clojure.org/about/state

• State = value associate with identity at given time

• Memory cache, concurrent programming, …

• Atoms, refs, agents

Page 20: Road Trip To Component

Shared state

• Accessible from various namespaces

• Open connections and channels

• Global accessible configuration

• Mutability not required during runtime

Page 21: Road Trip To Component

Application configuration

• Function to load env variable

• Configuration in single atom

Page 22: Road Trip To Component
Page 23: Road Trip To Component
Page 24: Road Trip To Component

Application configuration

• Function to load env variable

• Configuration in single atom

• Config library

• Mount

• Component

Page 25: Road Trip To Component
Page 26: Road Trip To Component
Page 27: Road Trip To Component
Page 28: Road Trip To Component

Stuart Sierra’s Component

Page 29: Road Trip To Component

What is ‘Component’

• managing lifecycle and dependencies of components with runtime state

• db access, external API services, web server

• system of components

Page 30: Road Trip To Component
Page 31: Road Trip To Component
Page 32: Road Trip To Component
Page 33: Road Trip To Component
Page 34: Road Trip To Component

How it solves our problem

• Enforcing structure in code

• State defined in single place

• Better visibility of system

Page 35: Road Trip To Component

Testing

• Mock components

• Integration tests for complex flow

• E2E test

Page 36: Road Trip To Component
Page 37: Road Trip To Component
Page 38: Road Trip To Component
Page 39: Road Trip To Component
Page 40: Road Trip To Component

REPL interaction

• Define development system

• Multiple systems in single JVM

• No need to restart REPL

Page 41: Road Trip To Component
Page 42: Road Trip To Component

Production• Avoid accessing production system !!

• Visualise system & strong subsystem boundaries

• Debugging

• Add ad hoc components when required

Page 43: Road Trip To Component
Page 44: Road Trip To Component

The bad parts …• “all or nothing”

• Failures during system startup

• Trying to use “wrappers”

• Integration with other libraries

• OO approach

Page 45: Road Trip To Component

End of journey

Page 46: Road Trip To Component

Resources

https://clojure.org/indexhttps://github.com/stuartsierra/componenthttps://github.com/tolitius/mounthttp://www.joyofclojure.comhttp://thinkrelevance.com/blog/2013/11/07/when-should-you-use-clojures-object-oriented-featureshttps://purelyfunctional.tv/issues/clojure-gazette-180-how-do-you-structure-your-apps/https://cb.codes/organizing-clojure-projects-and-libraries/

… and lots of other Clojure talks, articles and discussions

Page 47: Road Trip To Component

Questions?