From 9e173f546829b84dc9fddff17f7e3fba63ce54e5 Mon Sep 17 00:00:00 2001 From: Marcos Uchoa Date: Sun, 17 Aug 2025 22:03:38 -0300 Subject: [PATCH] maybe this my nginx ideal config, lets go --- docker-compose-nginx.yml | 12 +++++----- nginx.conf | 4 ++-- src/context/config.zig | 4 ++-- src/payment_integrator.zig | 6 ++--- src/server.zig | 12 +++++++++- src/services/http_service.zig | 2 +- src/services/service_pool.zig | 43 ++++++----------------------------- 7 files changed, 32 insertions(+), 51 deletions(-) diff --git a/docker-compose-nginx.yml b/docker-compose-nginx.yml index 05804c2..eb09439 100644 --- a/docker-compose-nginx.yml +++ b/docker-compose-nginx.yml @@ -15,7 +15,7 @@ services: resources: limits: cpus: "0.50" - memory: "150MB" + memory: "100MB" zig1: &zig container_name: zig-pay-1 @@ -24,10 +24,10 @@ services: - SERVER_ENV=PROD - DEFAULT_HOST=payment-processor-default - DEFAULT_PORT=8080 - - DEFAULT_POOL=300 + - DEFAULT_POOL=400 - FALLBACK_HOST=payment-processor-fallback - FALLBACK_PORT=8080 - - FALLBACK_POOL=100 + - FALLBACK_POOL=200 - PORT=8080 - PAYMENT_SUMMARY_EXCHANGE_HOST=zig2 - PAYMENT_SUMMARY_EXCHANGE_PORT=6969 @@ -37,7 +37,7 @@ services: resources: limits: cpus: "0.50" - memory: "100MB" + memory: "125MB" zig2: <<: *zig container_name: zig-pay-2 @@ -45,10 +45,10 @@ services: - SERVER_ENV=PROD - DEFAULT_HOST=payment-processor-default - DEFAULT_PORT=8080 - - DEFAULT_POOL=300 + - DEFAULT_POOL=400 - FALLBACK_HOST=payment-processor-fallback - FALLBACK_PORT=8080 - - FALLBACK_POOL=100 + - FALLBACK_POOL=200 - PORT=8080 - PAYMENT_SUMMARY_EXCHANGE_HOST=zig1 - PAYMENT_SUMMARY_EXCHANGE_PORT=6969 diff --git a/nginx.conf b/nginx.conf index 1aff63b..5cd8184 100644 --- a/nginx.conf +++ b/nginx.conf @@ -9,8 +9,8 @@ events { http { access_log off; error_log /dev/null crit; - keepalive_requests 8000; - keepalive_timeout 230; + keepalive_requests 10000; + keepalive_timeout 600; tcp_nopush on; diff --git a/src/context/config.zig b/src/context/config.zig index 5463fb6..4f8b5c5 100644 --- a/src/context/config.zig +++ b/src/context/config.zig @@ -33,13 +33,13 @@ pub const Config = struct { const default_port_env = envMap.get("DEFAULT_PORT"); const default_port = try std.fmt.parseInt(u16, default_port_env orelse "8001", 10); const default_pool_env = envMap.get("DEFAULT_POOL"); - const default_pool = try std.fmt.parseInt(u16, default_pool_env orelse "20", 10); + const default_pool = try std.fmt.parseInt(u16, default_pool_env orelse "200", 10); const fallback_host = envMap.get("FALLBACK_HOST") orelse "localhost"; const fallback_port_env = envMap.get("FALLBACK_PORT"); const fallback_port = try std.fmt.parseInt(u16, fallback_port_env orelse "8002", 10); const fallback_pool_env = envMap.get("FALLBACK_POOL"); - const fallback_pool = try std.fmt.parseInt(u16, fallback_pool_env orelse "10", 10); + const fallback_pool = try std.fmt.parseInt(u16, fallback_pool_env orelse "100", 10); const payment_summary_exchange_host = envMap.get("PAYMENT_SUMMARY_EXCHANGE_HOST"); const payment_summary_exchange_port_env = envMap.get("PAYMENT_SUMMARY_EXCHANGE_PORT"); diff --git a/src/payment_integrator.zig b/src/payment_integrator.zig index 5805f50..2ab1f55 100644 --- a/src/payment_integrator.zig +++ b/src/payment_integrator.zig @@ -79,7 +79,7 @@ pub const PaymentIntegrator = struct { pi.is_integrated = true; // liar } else { pi.payment.requested_at = DateTime.now(); - pi.ticket = self.service_pool.dive(pi.getMessage()) catch null; + pi.ticket = self.service_pool.dive(pi.getMessage(), MAX_RETRY - pi.retries) catch null; pi.retries -= 1; } } else if (pi.ticket.?.status == .try_again) { @@ -88,8 +88,8 @@ pub const PaymentIntegrator = struct { pi.payment.integration_status = .not_integrated; pi.is_integrated = true; // liar } else { - //pi.payment.requested_at = DateTime.now(); - pi.ticket = self.service_pool.dive(pi.getMessage()) catch null; + pi.payment.requested_at = DateTime.now(); + pi.ticket = self.service_pool.dive(pi.getMessage(), MAX_RETRY - pi.retries) catch null; pi.retries -= 1; } } else if (pi.ticket.?.status == .new or pi.ticket.?.status == .pending) { diff --git a/src/server.zig b/src/server.zig index b3ad680..816b515 100644 --- a/src/server.zig +++ b/src/server.zig @@ -126,7 +126,7 @@ pub const HttpServer = struct { .method = http_method, .path = path, .query = query, - .body = if (req_len > 70) buffer_request[req_len - 70 .. req_len] else buffer_request[0..0], + .body = if (http_method == .POST) buffer_request[findBeginJson(&buffer_request)..req_len] else buffer_request[0..0], }; response = Response{ @@ -161,6 +161,16 @@ pub const HttpServer = struct { return b; } + fn findBeginJson(buf: []const u8) usize { + for (0..buf.len) |i| { + if (buf[i] == '{' and (i > 0 and buf[i - 1] == '\n')) { + return i; + } + } + + return if (buf.len == 0) 0 else buf.len - 1; + } + pub fn handleReqRes(self: HttpServer, req: *Request, res: *Response) void { switch (req.method) { .GET => resolveEndpoint(req, res, self.get_endpoints), diff --git a/src/services/http_service.zig b/src/services/http_service.zig index 502e655..2f2cfc2 100644 --- a/src/services/http_service.zig +++ b/src/services/http_service.zig @@ -194,7 +194,7 @@ pub const HttpService = struct { pub fn startMessenger(self: *HttpService, connections: []ServiceConnection, tickets: []ServiceTicket, thread_id: usize) void { while (true) { - Thread.sleep(20_000_000); + Thread.sleep(30_000_000); if (self.thread_stop[thread_id]) { var conn_open = false; diff --git a/src/services/service_pool.zig b/src/services/service_pool.zig index 6eb8f23..c30e8ee 100644 --- a/src/services/service_pool.zig +++ b/src/services/service_pool.zig @@ -27,11 +27,11 @@ pub const ServicePool = struct { self.services_len += 1; } - pub fn dive(self: *ServicePool, message: []const u8) ServicePoolError!*ServiceTicket { - var skip: [10]bool = .{false} ** 10; + pub fn dive(self: *ServicePool, message: []const u8, numberOfRetries: i32) ServicePoolError!*ServiceTicket { + //var skip: [10]bool = .{false} ** 10; for (0..self.services_len) |_| { - var best_service = self.findBestService(&skip); + var best_service = self.findBestService(numberOfRetries); if (best_service == null) { return error.NoServiceAvailable; @@ -49,41 +49,12 @@ pub const ServicePool = struct { return error.NoServiceAvailable; } - fn findBestService(self: *ServicePool, skip: []bool) ?*HttpService { - var first_service_available_i: ?usize = null; - var best_perfomance_i: ?usize = null; - - for (0..self.services_len) |i| { - if (skip[i]) { - continue; - } - - const service = self.services[i]; - - if (service.health == .unavailable or service.capacity >= 90) { - continue; - } - - if (first_service_available_i == null) { - first_service_available_i = i; - } - - if (best_perfomance_i == null or self.services[best_perfomance_i.?].response_time > service.response_time) { - best_perfomance_i = i; - } + fn findBestService(self: *ServicePool, numberOfRetries: i32) ?*HttpService { + if (numberOfRetries > 500) { + return self.services[1]; } - if (best_perfomance_i != null) { - skip[best_perfomance_i.?] = true; - return self.services[best_perfomance_i.?]; - } - - if (first_service_available_i != null) { - skip[first_service_available_i.?] = true; - return self.services[first_service_available_i.?]; - } - - return null; + return self.services[0]; } };