kafka-spring-flutter 시행착오

오븐·2023년 7월 20일

개발 중 삽질 과정을 기록하려고 한다.

재해 알림처럼 빠르게 전달해야하는 데이터가 있다... 이걸 알림으로 전달하면 제일 쉽겠으나 사용자가 알림을 거부하면 무용지물일 것이다. 어떻게 하지 끙끙거리다가 우선 sse로 개발해보기로 했다.

이렇게 보내서

package com.junge.api.controller.server;

import com.junge.api.Model.server.RealTimeData;
import org.apache.kafka.clients.consumer.ConsumerRecord;
import org.springframework.http.MediaType;
import org.springframework.kafka.annotation.KafkaListener;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Sinks;

import java.io.IOException;

@RestController
@RequestMapping("/server-events")
public class ServerEventsController {

    private Sinks.Many<String> realTimeDataMany = Sinks.many().multicast().onBackpressureBuffer();

    public void sendData(String data) {
        this.realTimeDataMany.tryEmitNext(data);
    }

    @GetMapping(produces = MediaType.TEXT_EVENT_STREAM_VALUE)
    public Flux<String> KafkaDataProcess() throws IOException {
        return this.realTimeDataMany.asFlux();
    }

    @KafkaListener(topics = "topic1", groupId = "test") // 카프카로 정보를 받는다.
    void listener(ConsumerRecord<String, String> record) throws IOException {
        sendData(record.value());
    }


}

이렇게 받는다.

import 'package:flutter/material.dart';
import 'package:sse_channel/sse_channel.dart';

void getData() {
  final channel =
  SseChannel.connect(Uri.parse('http://주소:8080/server-events'));

  channel.stream.listen((data) {
    print(data);
  });
}

받기는 하나 build를 하니 앱이 죽으려고 한다. 아마 구글 지도나 여러가지를 최적화하지 않은 상태에서 연결을 하니 그런듯. 다른 걸 최적화하는 방법이 있지만 sse 라이브러리가 업데이트되는 것 같지 않아(공식 계정 sse 라이브러리가 http 0.13.5를 사용한다.) 다른 방법을 생각해보기로 했다.

profile
하루에 한번 정권 찌르기

1개의 댓글

comment-user-thumbnail
2023년 7월 20일

유익한 글 잘 봤습니다, 감사합니다.

답글 달기