aboutsummaryrefslogblamecommitdiff
path: root/_slides/2020-10-22-datomic-on-global-good-reasons-for-and-against-it.slides
blob: 8f207c93b764366aca28e37b0f213f64f5b9c2ba (plain) (tree)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15














                                                           





                                                      




                              





                                                  







                                             










































































































                                                                       
 
                                                                            
 
                                                     








                                                                                                                             
                                                                                                                        
---
title: "Datomic on global: good reasons for and against it"
date: 2020-10-22
layout: slides
lang: en
ref: datomic-on-global-good-reasons-for-and-against-it
published: false
---

# Datomic on global

**Good** reasons for and against it

---

# Premise

Datomic's bottleneck is **write** throughput, not read

---

When creating a new service...

---

```clojure
(defn database-for-service
  [service]
  (let [prototype (prototype-for-service service)]
    (if (= :global prototype)
      :datomic
      #{:dynamodb :redis :nothing})))
```

---

...which is, in my opinion, a poor heuristic.

---

The deciding factor shouldn't be the prototype, but the **cardinality**

---

```diff
 (defn database-for-service
   [service]
-  (let [prototype (prototype-for-service service)]
-    (if (= :global prototype)
-      :datomic
-      #{:dynamodb :redis :nothing})))
+  (let [cardinality (cardinality-for-service service)]
+    (if (= :too-high cardinality)
+      #{:dynamodb :redis :nothing
+      :datomic))))
```

---

```clojue
(defn database-for-service
  [service]
  (let [cardinality (cardinality-for-service service)]
    (if (= :too-high cardinality)
      #{:dynamodb :redis :nothing
      :datomic))))
```

---

But how to determine when the cardinality is

**`:too-high`**?

---

Let's think about the cardinality of existing services we know

---

What is the cardinality of...

---

# savings-accounts

---

# inductor

---

# crebito

---

# diablo

---

# lost-boy?

---

# hook?

---

# ledger

---

# blackleach

---

# notification

---

# toasty

---

# auth

---

# waypoint

---

# jurassic-park

---

Compare the database choice of services with similar cardinalities:

## notifications vs toasty

---

Compare different cardinalities for services on global prototype:

## jurassic-park vs auth

---

Compare different cardinality for different services inside the same domain:

## savings-accounts -> blackleach -> diablo -> ledger

---

## Thank you!

References:

1. these slides: [{{ site.tld }}/slides.html]({% link slides.md %})
2. [prose version of this presentation]({% link _articles/2020-10-22-datomic-on-global-good-reasons-for-and-against-it.md %})
3. "[Understanding Database Sharding](https://www.digitalocean.com/community/tutorials/understanding-database-sharding)"