Kotlin에서 작업자 풀을 구현하여 WebDav를 통해 Hetzner StorageBox에 이미지 업로드

작업자 풀



최근 Go로 프로젝트를 수행하는 동안 병렬 처리를 수행하기 위해 Worker Pools on GoByExample을 발견했습니다. Kotlin에서 Worker Pools를 구현하기 위한 많은 리소스를 찾지 못했지만 현재 Spring Boot + Kotlin 웹앱에 좋은 아이디어인 것 같습니다.

코틀린



Kotlin은 고루틴과 매우 유사한 동시성을 위해 코루틴을 사용합니다.

코루틴은 구조화된 동시성을 사용하여 각 코루틴의 수명을 특정 범위로 구분합니다.

작업자 그룹을 생성하려면 애플리케이션이 실행되는 동안 지속되는 코루틴 범위를 생성해야 합니다. SupervisorJob() 컨텍스트를 사용하여 이 동작을 수행합니다.

private val coroutineScope = CoroutineScope(SupervisorJob() + Dispatchers.Default)


그런 다음 이미지 데이터 및 업로드할 URL에 대한 대기열로 버퍼링된 채널을 만듭니다.

val channel = Channel<Pair<String, ByteArray>>(10000)


저는 Spring @PostConstruct 주석을 사용하여 작업자 그룹을 만들고 채널에서 새 데이터를 수신합니다.
항목이 대기열에 있을 때마다 업로드 기능을 시작합니다. 대기열에 항목이 없으면 기능이 일시 중지됩니다.

@PostConstruct
    fun createWorkerGroup() {
        coroutineScope.launch {
            for (x in 1..5) {
                launch {
                    println("Create Worker $x")
                    while (true) {
                        uploadImage(channel.receive())
                    }
                }
            }
        }
    }


마지막으로 runBlocking 코루틴 범위 내 채널에 데이터를 보낼 수 있습니다.

runBlocking {
  uploadService.channel.send(Pair(url, image.bytes))
}


WebDav



내 webapp 사용자는 휴대폰에서 내 웹 서버로 이미지를 업로드하고 나중에 S3 객체 스토리지에 대한 저렴한 대안으로 webdav를 통해 이 사진을 Hetzner Storage Box에 업로드하려고 합니다.

단순성을 위해 sardine java webdav 클라이언트 라이브러리를 사용합니다.

사용법은 매우 간단합니다. 다음을 사용하여 클라이언트를 구성합니다.

val sardine = SardineFactory.begin("webDavUsername", "webDavPassword")


uploadImage 함수는 이전에 생성한 채널을 통해 새 이미지가 전송될 때마다 호출됩니다. 이 함수에서 sarding.put()을 호출하여 이미지 파일을 저장합니다.

sardine.put("https://username.your-storagebox.de/foldername/imagename.jpg", ImageByteArray)


이것이 고도의 병렬 파일 서비스를 갖추기 위해 필요한 전부입니다.

Github에서 소스 코드를 볼 수 있습니다: UploadService.kt ImageService.kt

좋은 웹페이지 즐겨찾기