Files
AndroidAisMap/BATCH_LOGGING_SERVER.md

3.5 KiB

Пакетная отправка логов - Серверная часть

Новый endpoint для пакетной отправки логов

POST /logs/batch

Принимает JSON с массивом логов и сохраняет их в базу данных одним запросом.

Формат запроса:

{
  "logs": [
    {
      "type": "nmea",
      "message": "$GPGGA,123456.00,5542.1234,N,03741.5678,E,1,08,1.0,545.4,M,46.9,M,,*47",
      "color": "#8AB4F8",
      "timestamp": 1642248000000
    },
    {
      "type": "errors", 
      "message": "[2024-01-15 12:00:00] AIS_PARSE_ERROR: Ошибка парсинга AIS: Неверная контрольная сумма",
      "color": "#FF8A80",
      "timestamp": 1642248001000
    },
    {
      "type": "ships",
      "message": "MMSI: 123456789 | Class A: lat=55.123456, lon=37.123456, course=45.0, speed=12.5",
      "color": "#FF5733",
      "timestamp": 1642248002000
    },
    {
      "type": "ble",
      "message": "BLE Data from AA:BB:CC:DD:EE:FF: $GPGGA,123456.00,5542.1234,N,03741.5678,E,1,08,1.0,545.4,M,46.9,M,,*47",
      "color": "#8AB4F8", 
      "timestamp": 1642248003000
    }
  ]
}

Реализация на Python (Flask):

@app.route("/logs/batch", methods=["POST"])
def add_logs_batch():
    try:
        data = request.get_json()
        logs = data.get("logs", [])
        
        if not logs:
            return "No logs provided", 400
        
        # Подготавливаем данные для batch INSERT
        log_data = []
        for log in logs:
            log_data.append((
                log.get("type", "unknown"),
                log.get("message", ""),
                log.get("color", "#FFFFFF"),
                datetime.fromtimestamp(log.get("timestamp", 0) / 1000) if log.get("timestamp") else datetime.now()
            ))
        
        # Batch INSERT всех логов одним запросом
        with get_conn() as conn:
            with conn.cursor() as cur:
                cur.executemany(
                    "INSERT INTO logs (log_type, message, color, ts) VALUES (%s, %s, %s, %s)",
                    log_data
                )
                conn.commit()
        
        return f"Added {len(logs)} logs successfully", 200
        
    except Exception as e:
        print(f"Error processing batch logs: {e}")
        return f"Error: {str(e)}", 500

Преимущества пакетной отправки:

Производительность: 1 HTTP запрос вместо N запросов
Надежность: Retry на уровне пакета
Контроль нагрузки: Отправка раз в секунду
Все логи сохраняются: Ничего не теряется
Меньше нагрузки на сервер: Batch INSERT вместо множественных INSERT

Типы логов:

  • nmea - NMEA сообщения (синий цвет)
  • errors - Ошибки парсинга (красный цвет)
  • ships - Информация о кораблях (уникальный цвет по MMSI)
  • ble - BLE данные (синий цвет)

Обработка ошибок:

  • При ошибке HTTP запроса логи возвращаются в буфер
  • Retry происходит автоматически через секунду
  • Сервер возвращает HTTP 200 при успехе, 500 при ошибке