Tuesday, July 12, 2016

KafkaConsumer is not safe for multi-threaded access

I work on project with Play framework Scala, with Guice plugins. It's very nice!

Yesterday, I met the exception:

2016-07-11 08:56:22,936 [ERROR] from akka.actor.OneForOneStrategy in application-akka.actor.default-dispatcher-6 - KafkaConsumer is not safe for multi-threaded access
java.util.ConcurrentModificationException: KafkaConsumer is not safe for multi-threaded access
    at org.apache.kafka.clients.consumer.KafkaConsumer.acquire(KafkaConsumer.java:1324) ~[org.apache.kafka.kafka-clients-0.9.0.1.jar:na]
    at org.apache.kafka.clients.consumer.KafkaConsumer.subscribe(KafkaConsumer.java:713) ~[org.apache.kafka.kafka-clients-0.9.0.1.jar:na]
    at org.apache.kafka.clients.consumer.KafkaConsumer.subscribe(KafkaConsumer.java:747) ~[org.apache.kafka.kafka-clients-0.9.0.1.jar:na]
    at services.kafka.KafkaServiceImpl.consume(KafkaService.scala:73) ~[bb-api.bb-api-1.0-sans-externalized.jar:na]

Reason: I run 2 consumers (difference threads), but just one KafkaService. And I use singleton for it (with Google Guice module). So, when running consumer, it conflict each other.

How to solve? Use @Named annotation in binding.

For example, this is my module file:

class KafkaModule extends AbstractModule with ScalaModule with AkkaGuiceSupport {

  override def configure(): Unit = {
    bind[services.kafka.KafkaService[String, String]].annotatedWith(Names.named("kafka-Coccoc")).to[services.kafka.KafkaServiceImpl].in[Singleton]
    bind[services.kafka.KafkaService[String, String]].annotatedWith(Names.named("kafka-Report")).to[services.kafka.KafkaServiceImpl].in[Singleton]
  }
}

Then, I rewrite my consumer code. Example:

class ReportConsumerActor @Inject() (@Named("kafka-Report") val kafkaService: KafkaService[String, String])
                                    (implicit ec: ExecutionContext){

  def receive: Receive = {
    kafkaService.consume(__SOME_CODE_HERE__)
  }
}

That's all! Hope this help.

Monday, February 1, 2016

TL;DR - Ý nghĩa của OpenGL và các thư viện glew, glu, glut,...

Bài này tổng hợp một số thư viện liên quan đến OpenGL mà hầu hết mọi người đều đụng phải nếu làm việc với OpenGL.

Tôi chỉ hướng tới khái niệm thôi, bạn tự tìm hiểu sâu hơn nếu cần.

OpenGL

OpenGL (Open Graphics Library - http://en.wikipedia.org/wiki/OpenGL)
  • Thư viện render đồ hoạ 2D và 3D
  • Cross-platform, viết bằng C
  • Tập trung vào việc tương tác với GPU

OpenGL-ES

OpenGL-ES (OpenGL for Embedded System - http://en.wikipedia.org/wiki/OpenGL_ES), thường được viết là GLES:
  • Tập con của OpenGL
  • Sử dụng cho các hệ thống nhúng như smartphone, tablet, game console,...

WebGL

WebGL (Web Graphics Library - http://en.wikipedia.org/wiki/WebGL):
  • Thư viện render đồ hoạ 2D và 3D cho trình duyệt
  • API cho JavaScript
  • Được viết dựa trên OpenGL-ES
  • Tương tác với GPU thông qua trình duyệt

GLU

  • Chứa các hàm tiện ích cho OpenGL
  • Tập trung vào mapping giữa các hệ trục toạ độ và các loại kích thước màn hình

GLEW

GLEW (OpenGL Extension Wrangler Library - http://en.wikipedia.org/wiki/OpenGL_Extension_Wrangler_Library):
  • Chứa các hàm tiện ích cho OpenGL
  • Tập trung vào việc load các OpenGL Extension

GLUT

GLUT (OpenGL Utility Toolkit - http://en.wikipedia.org/wiki/OpenGL_Utility_Toolkit):
  • Chứa các hàm tiện ích cho OpenGL
  • Tập trung vào việc dựng và quản lý cửa sổ, các sự kiện bàn phím và chuột

SDL

SDL (Simple DirectMedia Library - http://en.wikipedia.org/wiki/Simple_DirectMedia_Layer):
  • Thư viện phát triển cho OpenGL
  • Tương tác với phần cứng hoặc low-level
  • Làm việc với audio, keyboard, mouse, joystick, graphic hardware,...
  • Có thể được dùng ở các thư viện đồ hoạ khác như DirectX

QT

  • Là framework dùng để thiết kế GUI
  • Chứa khá nhiều widget
  • Được sử dụng khá nhiều trong giới làm OpenGL

Biểu mẫu liên hệ

Name

Email *

Message *