+8
-10
docker-compose.yml
+8
-10
docker-compose.yml
···
9
9
deploy:
10
10
resources:
11
11
limits:
12
-
cpus: "0.1"
12
+
cpus: "0.15"
13
13
memory: "30MB"
14
14
volumes:
15
15
- redis-data:/data
16
16
17
-
api1: &app
17
+
api1: &app # image: pedrohcorrea/rinha-backend-2025-gleam:latest
18
18
build:
19
19
context: .
20
20
container_name: api1
···
25
25
environment:
26
26
REDIS_CONN: valkey
27
27
PROVIDERS: "http://payment-processor-default:8080,http://payment-processor-fallback:8080"
28
-
PROCESSOR_QTT: 1
29
-
PROCESSOR_TIME: 50
28
+
PROCESSOR_TIME: 40
30
29
depends_on:
31
30
- valkey
32
31
deploy:
33
32
resources:
34
33
limits:
35
-
cpus: "1"
36
-
memory: "255MB"
34
+
cpus: "0.8"
35
+
memory: "235MB"
37
36
38
37
api2:
39
38
<<: *app
40
39
container_name: api2
41
40
environment:
42
41
REDIS_CONN: valkey
43
-
PROVIDERS:
44
42
deploy:
45
43
resources:
46
44
limits:
47
-
cpus: "0.3"
48
-
memory: "55MB"
45
+
cpus: "0.4"
46
+
memory: "75MB"
49
47
50
48
nginx:
51
49
image: nginx:1.29.0-alpine
···
61
59
deploy:
62
60
resources:
63
61
limits:
64
-
cpus: "0.1"
62
+
cpus: "0.15"
65
63
memory: "10MB"
66
64
67
65
volumes:
-2
src/processor.gleam
-2
src/processor.gleam
···
93
93
actor.continue(state)
94
94
}
95
95
HealthCheck -> {
96
-
echo "Healthcheck"
97
96
let provider =
98
97
get_faster_healthcheck(state.providers, state.selected_provider)
99
98
···
121
120
122
121
let body_to_send = message |> provider.create_body
123
122
124
-
echo "Sending request to " <> processor.selected_provider.url
125
123
case provider.send_request(processor.selected_provider, body_to_send) {
126
124
Ok(_) -> {
127
125
message
+17
-28
src/rinha_2025.gleam
+17
-28
src/rinha_2025.gleam
···
3
3
import gleam/int
4
4
import gleam/list
5
5
import gleam/otp/static_supervisor as supervisor
6
-
import gleam/otp/supervision
7
6
import gleam/string
8
7
import integrations/provider
9
8
import processor
···
18
17
let providers_env = util.get_env_var("PROVIDERS", "")
19
18
let assert Ok(processor_time) =
20
19
util.get_env_var("PROCESSOR_TIME", "100")
21
-
|> int.parse
22
-
let assert Ok(processor_qtt) =
23
-
util.get_env_var("PROCESSOR_QTT", "0")
24
20
|> int.parse
25
21
26
22
let providers =
···
44
40
redis.create_supervised_pool(redis_host)
45
41
let valky = valkyrie.named_connection(valkey_pool_name)
46
42
43
+
let ctx = server.Context(valkye_conn: valky)
44
+
45
+
use <- bool.lazy_guard(when: has_providers == False, return: fn() {
46
+
let assert Ok(_) =
47
+
supervisor.new(supervisor.OneForOne)
48
+
|> supervisor.add(valkey_pool)
49
+
|> supervisor.add(web.create_server_supervised(ctx))
50
+
|> supervisor.start
51
+
52
+
process.sleep_forever()
53
+
})
54
+
47
55
let worker_name = process.new_name("worker_pool")
48
56
let worker_pool_supervised =
49
57
processor.new(valky)
50
58
|> processor.named(worker_name)
51
59
|> processor.providers(providers)
52
60
|> processor.supervised
53
-
54
-
let ctx = server.Context(valkye_conn: valky)
55
61
56
62
let assert Ok(_) =
57
63
supervisor.new(supervisor.OneForOne)
58
64
|> supervisor.add(valkey_pool)
59
65
|> supervisor.add(web.create_server_supervised(ctx))
60
-
|> create_supervisor_with_processor(worker_pool_supervised, has_providers)
66
+
|> supervisor.add(worker_pool_supervised)
61
67
|> supervisor.start
62
68
63
-
use <- bool.lazy_guard(when: !has_providers, return: process.sleep_forever)
64
-
65
-
list.repeat(Nil, processor_qtt)
66
-
|> list.map(fn(a) {
67
-
process.spawn(fn() {
68
-
worker_name
69
-
|> process.named_subject
70
-
|> processor.loop_worker(processor_time)
71
-
})
72
-
a
69
+
process.spawn(fn() {
70
+
worker_name
71
+
|> process.named_subject
72
+
|> processor.loop_worker(processor_time)
73
73
})
74
74
75
75
process.spawn(fn() {
···
80
80
81
81
process.sleep_forever()
82
82
}
83
-
84
-
fn create_supervisor_with_processor(
85
-
manager: supervisor.Builder,
86
-
processor: supervision.ChildSpecification(process.Subject(processor.Message)),
87
-
has_processor: Bool,
88
-
) {
89
-
use <- bool.guard(when: !has_processor, return: manager)
90
-
91
-
manager
92
-
|> supervisor.add(processor)
93
-
}
+2
-2
src/web/controllers/payment_controller.gleam
+2
-2
src/web/controllers/payment_controller.gleam
+1
src/web/middleware.gleam
+1
src/web/middleware.gleam
+3
src/web/web.gleam
+3
src/web/web.gleam