From 81e889a2135c348f576ae7bc23fab7b8088b17ec Mon Sep 17 00:00:00 2001 From: Andrea Crotti Date: Wed, 20 Dec 2023 14:53:25 +0000 Subject: [PATCH] add live repl article --- src/assets/blog/test_in_production.jpg | Bin 0 -> 63038 bytes src/pages/blog/live_repl.mdx | 159 +++++++++++++++++++++++++ 2 files changed, 159 insertions(+) create mode 100644 src/assets/blog/test_in_production.jpg create mode 100644 src/pages/blog/live_repl.mdx diff --git a/src/assets/blog/test_in_production.jpg b/src/assets/blog/test_in_production.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ac7ad262ff2206b309ac6210d694e5fde181bb00 GIT binary patch literal 63038 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 ANdN!< literal 0 HcmV?d00001 diff --git a/src/pages/blog/live_repl.mdx b/src/pages/blog/live_repl.mdx new file mode 100644 index 000000000..8ec82c848 --- /dev/null +++ b/src/pages/blog/live_repl.mdx @@ -0,0 +1,159 @@ +--- +author: 'anc' +title: 'Live repling to infinity and beyond' +description: 'Everything you wanted (and not wanted) to know about Live REPLs' +category: 'clojure' +layout: '../../layouts/BlogPost.astro' +draft: true +publishedDate: '2024-01-05' +heroImage: 'test_in_production.jpg' +tags: + - 'clojure' +--- + +# Introduction + +If you are an experienced Clojure developer, I don't need to convince you of the beauty of REPL Driven Development. +This blog article is not about that, I wanted to focus on live REPLs, where a live REPL is just a REPL connected to a machine that's not your localhost. + +If you are new to Clojure or REPLs there are lots of great resources, such as: +- [REPL Driven Development, Clojure's +Superpower](https://www.youtube.com/watch?v=gIoadGfm5T8) +- [On repl-driven programming](https://mikelevins.github.io/posts/2020-12-18-repl-driven/) +- [What makes a repl](https://ericnormand.me/podcast/what-makes-a-repl) +- [REPL community resources](https://clojure.org/guides/repl/annex_community_resources) + +As part of this blog post, I've also created a small [project](https://github.com/andreacrotti/live-repl) to play around with the different types of REPLs and ways to connect to them. + +## What's in a REPL + +We could not start a blog post about Clojure without a definition. +From Wikipedia a REPL (*read-eval-print-loop*) is: + +> a simple interactive computer programming environment that takes single user inputs, executes them, and returns the result to the user.... + +Most programming languages nowadays have REPLs, but not all REPLs are created equal. + +Every REPL will allow you to explore a language, defining and evaluating new functions for example. +The big difference between Lisp (or Erlang/Elixir) REPLs and ones found in other programming languages like Python/Ruby however, is that the former allows you to interact with a live system, while the latter doesn't. + +For example, when you start iPython you can play around with Python, evaluate code interactively, but, you can't attach to a running Python process in production. +Being able to attach to a running process gives you super powers effectively, because it means that you can both explore the status of the living system and even change its behaviour without redeploying or even restarting the JVM. + +For historical reasons there are a few different REPls available in Clojure, I will just refer to this [comparison](https://nrepl.org/nrepl/1.0/alternatives.html) for that. +It's also interesting to note that even deciding what exactly is a REPL can be controversial, as mentioned in [this discussion](https://groups.google.com/g/clojure-dev/c/Dl3Stw5iRVA/m/D_Kcb-naOx4J). +For our purpose though a REPL is just a way to evaluate code remotely, and we'll just use `nrepl` for the examples, but you can see other examples of repls in [this namespace](https://github.com/AndreaCrotti/live-repl/blob/main/src/system.clj ). + +## Use cases + +### 1. Investigation + +The best reason to use a live REPL is (in my opinion) to investigate problems by checking the state of the live system. +For example, a few weeks ago we had a problem in production where the application kept crashing (with OOMs). +From the JMX metrics it was clear that the problem was the that number of threads was continuously increasing, but it wasn't clear why. + +All we had to do to find out the root cause of the problem was to get all names of the running threads from the live-repl with something like: + +```clojure +(sort (map #(.getName %) (keys (Thread/getAllStackTraces)))) +``` + +From the name of the threads it was clear that the culprit was related to a recent change, and was easy to fix. + +### 2. Live experimentation + +Sometimes it's quite hard to run a whole infrastructure locally, specially when your application depends on many other services that can't really be run locally. +It's always a good idea to invest as much as possible in your local environment, but when that's not enough a live repl (ideally connected to a dev environment), can help a lot. +Once you are happy with the changes, since most likely your normal IDE is connected to the remote REPL, you can just commit them and follow the normal deployment flow, being already pretty much certain that it will work fine once deployed. + +### 3. Maintenance tasks + +Most applications require a bunch of maintenance tasks, such as: +- creating new users +- change user permissions +- generate reports + +In an ideal world these tasks have an internal UI that talks to the internal API, however sometimes (specially in the beginning of a project) all this plumbing might not be available. +So one easy way to accomplish these tasks is to just have functions you can call from a live repl. +This is not really a novelty idea, it's also very common in the Django/Ruby-on-Rails world for example. + +### 4. Hotfix + +Last but not least a really important way to use a live-repl is to apply a hot-fix to production. +All the previous use cases don't really need to change the behaviour of the application, however, sometimes you might want to do that. + +You might have a bug in a production system, and know exactly how to fix it, but when every minute lost costs a lot of money, you still have this option. + +It's also true when you are not 100% sure of the fix, but the system is down anyway, so at least you can try it out very quickly instead of going through the whole flow. +In the simplest possible scenario all you have to do is to simply connect your IDE to the production REPL, re-evaluate the offending code with your fix, and everything is fixed. +It's not exactly as simple as that, but we'll look later in more detail at the limitations. +Of course hot reloading production code can be dangerous and should be done extremely rarely, but it can also be a life saver when you really need it. + +## Limitations + +For a live REPL to work, you need the language to support it. +In many languages, a REPL was an after thought, and sometimes you can't do everything from a REPL. +While in Clojure the REPL was always a first class citizen, you still have to be aware of a few things that cause issues with hot reloading, and write your application accordingly. + +Thankfully these tips also help with local development, and make your codebase nicer to work with. + +### JVM interop + +### Compile time + +Any operation + +### Resources + +## Security + +If you are allowing REPL access to your applications you need to keep in mind the potential danger, since anyone with REPL access to production can access anything that the production application can access. +From a live repl you could easily: +- break production +- delete data +- leak production data + +And by default there would not be any trace of what happened, even changes to the codebase would not be noticed by anyone and only be reverted when the JVM restarts. + +So if you do want to allow access to production you (at the very least): +- only allow access from a VPN (ideally the whole infrastructure is only accessible via VPN anyway) +- only allow access from a SSH tunnel (or use [TLS with nrepl for example](https://nrepl.org/nrepl/usage/tls.html)) + Another possible choice is to use [drawbridge](https://github.com/nrepl/drawbridge) and use HTTP Transport for nRepl. +- add auditing to make sure you can record who did what. + You might need a custom nRepl middleware to store. + +## Other tips + +- use separate checkouts of the project for local development & live repling (see potentially [git worktree](https://git-scm.com/docs/git-worktree) to help with that) +- add banners in the live repl to make sure you are aware of the environment you are connected to. + It's currently not exactly supported but might be in cider when [cider issue about dynamic banners](https://github.com/clojure-emacs/cider/issues/3599) is implemented. + It's also easy to hack it together yourself by creating some more functions. +- make sure you don't run tests in production (maybe avoid shipping them entirely in the build?) +- disable the \`cider-auto-test-mode\`, you never know you might delete some real data + +## Other resources + +- [nrepl middleware](https://nrepl.org/nrepl/design/middleware.html) +- [socket prepl cookbook](https://oli.me.uk/clojure-socket-prepl-cookbook/) +- [how to use prepl](https://blog.jakubholy.net/how-to-use-clojure-1.10-prepl/) +- [tools namespace](https://github.com/clojure/tools.namespace) +- [nrepl usage](https://nrepl.org/nrepl/usage/tls.html) +- [clojure workflow reloaded with component](https://cognitect.com/blog/2013/06/04/clojure-workflow-reloaded) +- [live repl sample repository](https://github.com/andreacrotti/live-repl) +- [repl socket Clojure examples](https://en.wikibooks.org/wiki/Clojure_Programming/Examples/REPL_Socket) +- [repl Wikipedia definition](https://en.wikipedia.org/wiki/Read%E2%80%93eval%E2%80%93loop) +- [bad nrepl article](https://metaredux.com/posts/2023/03/26/bad-nrepl.html) +- [nrepl history](https://nrepl.org/nrepl/about/history.html) +- [list of nRepl clients](https://nrepl.org/nrepl/usage/clients.html) +- [git worktree](https://git-scm.com/docs/git-worktree) +- [server REPL architecture definition](https://archive.clojure.org/design-wiki/display/design/Socket%2BServer%2BREPL.html) +- [integrant](https://github.com/weavejester/integrant) +- [integrant-repl](https://github.com/weavejester/integrant-repl) +- [cider issue about dynamic banners](https://github.com/clojure-emacs/cider/issues/3599) +- [nrepl and clojurescript](https://docs.cider.mx/cider/cljs/overview.html#nrepl-and-clojurescript) +- [bencode format (used by nRepl)](https://en.wikipedia.org/wiki/Bencodehttps://en.wikipedia.org/wiki/Bencode) +- [add-lib capability](https://insideclojure.org/2018/05/04/add-lib/) +- [AOT compilation in clojure](https://clojure.org/reference/compilation) +- [enhancing your repl workflow](https://clojure.org/guides/repl/enhancing_your_repl_workflow) +- [reveal](https://vlaaad.github.io/reveal/) +- [flappy bird interactive programming demo](https://www.youtube.com/watch?v=KZjFVdU8VLI )