maybe this my nginx ideal config, lets go

This commit is contained in:
Marcos Uchoa 2025-08-17 22:03:38 -03:00
parent 2bfbc31dcb
commit 9e173f5468
7 changed files with 32 additions and 51 deletions

View file

@ -15,7 +15,7 @@ services:
resources: resources:
limits: limits:
cpus: "0.50" cpus: "0.50"
memory: "150MB" memory: "100MB"
zig1: &zig zig1: &zig
container_name: zig-pay-1 container_name: zig-pay-1
@ -24,10 +24,10 @@ services:
- SERVER_ENV=PROD - SERVER_ENV=PROD
- DEFAULT_HOST=payment-processor-default - DEFAULT_HOST=payment-processor-default
- DEFAULT_PORT=8080 - DEFAULT_PORT=8080
- DEFAULT_POOL=300 - DEFAULT_POOL=400
- FALLBACK_HOST=payment-processor-fallback - FALLBACK_HOST=payment-processor-fallback
- FALLBACK_PORT=8080 - FALLBACK_PORT=8080
- FALLBACK_POOL=100 - FALLBACK_POOL=200
- PORT=8080 - PORT=8080
- PAYMENT_SUMMARY_EXCHANGE_HOST=zig2 - PAYMENT_SUMMARY_EXCHANGE_HOST=zig2
- PAYMENT_SUMMARY_EXCHANGE_PORT=6969 - PAYMENT_SUMMARY_EXCHANGE_PORT=6969
@ -37,7 +37,7 @@ services:
resources: resources:
limits: limits:
cpus: "0.50" cpus: "0.50"
memory: "100MB" memory: "125MB"
zig2: zig2:
<<: *zig <<: *zig
container_name: zig-pay-2 container_name: zig-pay-2
@ -45,10 +45,10 @@ services:
- SERVER_ENV=PROD - SERVER_ENV=PROD
- DEFAULT_HOST=payment-processor-default - DEFAULT_HOST=payment-processor-default
- DEFAULT_PORT=8080 - DEFAULT_PORT=8080
- DEFAULT_POOL=300 - DEFAULT_POOL=400
- FALLBACK_HOST=payment-processor-fallback - FALLBACK_HOST=payment-processor-fallback
- FALLBACK_PORT=8080 - FALLBACK_PORT=8080
- FALLBACK_POOL=100 - FALLBACK_POOL=200
- PORT=8080 - PORT=8080
- PAYMENT_SUMMARY_EXCHANGE_HOST=zig1 - PAYMENT_SUMMARY_EXCHANGE_HOST=zig1
- PAYMENT_SUMMARY_EXCHANGE_PORT=6969 - PAYMENT_SUMMARY_EXCHANGE_PORT=6969

View file

@ -9,8 +9,8 @@ events {
http { http {
access_log off; access_log off;
error_log /dev/null crit; error_log /dev/null crit;
keepalive_requests 8000; keepalive_requests 10000;
keepalive_timeout 230; keepalive_timeout 600;
tcp_nopush on; tcp_nopush on;

View file

@ -33,13 +33,13 @@ pub const Config = struct {
const default_port_env = envMap.get("DEFAULT_PORT"); const default_port_env = envMap.get("DEFAULT_PORT");
const default_port = try std.fmt.parseInt(u16, default_port_env orelse "8001", 10); 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_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_host = envMap.get("FALLBACK_HOST") orelse "localhost";
const fallback_port_env = envMap.get("FALLBACK_PORT"); const fallback_port_env = envMap.get("FALLBACK_PORT");
const fallback_port = try std.fmt.parseInt(u16, fallback_port_env orelse "8002", 10); 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_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_host = envMap.get("PAYMENT_SUMMARY_EXCHANGE_HOST");
const payment_summary_exchange_port_env = envMap.get("PAYMENT_SUMMARY_EXCHANGE_PORT"); const payment_summary_exchange_port_env = envMap.get("PAYMENT_SUMMARY_EXCHANGE_PORT");

View file

@ -79,7 +79,7 @@ pub const PaymentIntegrator = struct {
pi.is_integrated = true; // liar pi.is_integrated = true; // liar
} else { } else {
pi.payment.requested_at = DateTime.now(); 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; pi.retries -= 1;
} }
} else if (pi.ticket.?.status == .try_again) { } else if (pi.ticket.?.status == .try_again) {
@ -88,8 +88,8 @@ pub const PaymentIntegrator = struct {
pi.payment.integration_status = .not_integrated; pi.payment.integration_status = .not_integrated;
pi.is_integrated = true; // liar pi.is_integrated = true; // liar
} else { } else {
//pi.payment.requested_at = DateTime.now(); 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; pi.retries -= 1;
} }
} else if (pi.ticket.?.status == .new or pi.ticket.?.status == .pending) { } else if (pi.ticket.?.status == .new or pi.ticket.?.status == .pending) {

View file

@ -126,7 +126,7 @@ pub const HttpServer = struct {
.method = http_method, .method = http_method,
.path = path, .path = path,
.query = query, .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{ response = Response{
@ -161,6 +161,16 @@ pub const HttpServer = struct {
return b; 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 { pub fn handleReqRes(self: HttpServer, req: *Request, res: *Response) void {
switch (req.method) { switch (req.method) {
.GET => resolveEndpoint(req, res, self.get_endpoints), .GET => resolveEndpoint(req, res, self.get_endpoints),

View file

@ -194,7 +194,7 @@ pub const HttpService = struct {
pub fn startMessenger(self: *HttpService, connections: []ServiceConnection, tickets: []ServiceTicket, thread_id: usize) void { pub fn startMessenger(self: *HttpService, connections: []ServiceConnection, tickets: []ServiceTicket, thread_id: usize) void {
while (true) { while (true) {
Thread.sleep(20_000_000); Thread.sleep(30_000_000);
if (self.thread_stop[thread_id]) { if (self.thread_stop[thread_id]) {
var conn_open = false; var conn_open = false;

View file

@ -27,11 +27,11 @@ pub const ServicePool = struct {
self.services_len += 1; self.services_len += 1;
} }
pub fn dive(self: *ServicePool, message: []const u8) ServicePoolError!*ServiceTicket { pub fn dive(self: *ServicePool, message: []const u8, numberOfRetries: i32) ServicePoolError!*ServiceTicket {
var skip: [10]bool = .{false} ** 10; //var skip: [10]bool = .{false} ** 10;
for (0..self.services_len) |_| { for (0..self.services_len) |_| {
var best_service = self.findBestService(&skip); var best_service = self.findBestService(numberOfRetries);
if (best_service == null) { if (best_service == null) {
return error.NoServiceAvailable; return error.NoServiceAvailable;
@ -49,41 +49,12 @@ pub const ServicePool = struct {
return error.NoServiceAvailable; return error.NoServiceAvailable;
} }
fn findBestService(self: *ServicePool, skip: []bool) ?*HttpService { fn findBestService(self: *ServicePool, numberOfRetries: i32) ?*HttpService {
var first_service_available_i: ?usize = null; if (numberOfRetries > 500) {
var best_perfomance_i: ?usize = null; return self.services[1];
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;
}
} }
if (best_perfomance_i != null) { return self.services[0];
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;
} }
}; };