liiklus:基於事件的Reactive(RSocket/gRPC)系統
Liiklus [li:klus](愛沙尼亞語中的“流量”) - 基於gRPC的閘道器,用於基於事件的系統,如果你認為Kafka實現事件系統過於底層,可以使用該系統:
- 水平可擴充套件的gRPC流媒體閘道器
- 支援與gRPC一樣多的客戶端語言(Java,Go,C ++,Python等)
- 響應reactive第一
- 每個分割槽有背壓感知源
- 至少一次/最多一次交付保證
- 可插拔事件儲存(Kafka,Pulsar,Kinesis等......)
- 可插拔位置儲存(DynamoDB,Cassandra,Redis等...)
- WIP:冷事件儲存支援(S3,Minio,SQL,鍵/值等...)
目前誰在使用?
- https://vivy.com/ - 25多個微服務,Kafka面前的共享日誌基礎設施(事件溯源/ CQRS)抽象
開始使用:
$ docker run \ -e kafka_bootstrapServers=some.kafka.host:9092 \ -e storage_positions_type=MEMORY \ # only for testing, DO NOT use in production -p 6565:6565 \ bsideup/liiklus:$LATEST_VERSION |
現在可以使用LiiklusService.proto生成您的客戶端。
客戶端必須實現以下演算法:
- 訂閱作業:
stub.subscribe(SubscribeRequest( topic="your-topic", group="your-consumer-group", [autoOffsetReset="earliest|latest"]))
- 接受:對Subscribe使用相同頻道的每個發出的回覆:
stub.receive(ReceiveRequest( assignment=reply.getAssignment()))
- 確認
stub.ack(AckRequest( assignment=reply.getAssignment(), offset=record.getOffset()))
注1:如果在處理之前確認記錄是最多一次,在處理後確認記錄是至少一次
注意2:建議每隔n個記錄確認一次,或者每隔n秒確認一次,以減少位置儲存庫的負載
使用Project Reactor和reactive-grpc的示例程式碼:
var stub = ReactorLiiklusServiceGrpc.newReactorStub(channel); stub .subscribe( SubscribeRequest.newBuilder() .setTopic("user-events") .setGroup("analytics") .setAutoOffsetReset(AutoOffsetReset.EARLIEST) .build() ) .flatMap(reply -> stub .receive(ReceiveRequest.newBuilder().setAssignment(reply.getAssignment()).build()) .window(1000) // ACK every 1000th records .concatMap( batch -> batch .map(ReceiveReply::getRecord) // TODO process instead of Mono.delay(), i.e. by indexing to ElasticSearch .concatMap(record -> Mono.delay(Duration.ofMillis(100))) .sample(Duration.ofSeconds(5)) // ACK every 5 seconds .onBackpressureLatest() .delayUntil(record -> stub.ack( AckRequest.newBuilder() .setAssignment(reply.getAssignment()) .setOffset(record.getOffset()) .build() )), 1 ) ) .blockLast() |
相關文章
- Spring RSocket:基於服務註冊發現的 RSocket 負載均衡Spring負載
- 基於C#的GRPCC#RPC
- 基於rust實現的事件系統,支援同步和非同步Rust事件非同步
- 基於RxJava的函式式Reactive Web框架:datamillRxJava函式ReactWeb框架
- 使用 JavaFX 構建 Reactive 系統JavaReact
- Laravel + go-micro + grpc 實踐基於 Zipkin 的分散式鏈路追蹤系統LaravelGoRPC分散式
- 基於JavaScript的機器學習系統JavaScript機器學習
- Backpressure in Reactive Systems 響應式系統的反壓React
- Cribbb基於DDD/Domain Event領域事件的開源PHP通知系統AI事件PHP
- 基於事件的排程事件
- Spring生態系統中的Reactor、WebFlux和RSocket區別? - FranciscoSpringReactWebUX
- 全鏈路營銷|基於事件驅動的流程編排系統 策略中心繫統事件
- 基於Web的系統測試Web
- Docker Swarm :gRPC 基於 DNS 的負載均衡DockerSwarmRPCDNS負載
- 關於 Laravel 框架事件系統的一點認識Laravel框架事件
- 基於雲的MES系統軟體
- 基於thincmf的內容管理系統
- 基於SpringBoot 的CMS系統Spring Boot
- 基於SSM的職員考勤系統SSM
- LKCOS:基於程式移植的COS系統
- 如何基於gRPC溝通微服務框架RPC微服務框架
- 介紹基於事件的架構事件架構
- 基於等待事件的效能診斷事件
- GRPC——高效能基於HTTP/2的RPC框架RPCHTTP框架
- akka-grpc - 基於akka-http和akka-streams的scala gRPC開發工具RPCHTTP
- Laravel事件系統的使用Laravel事件
- 基於Linux系統的影片點播系統的實現(轉)Linux
- 基於GitHub Issues的評論系統--gitmentGithub
- 基於TP3.2.3的問答系統!
- 基於thinkphp的會員推廣系統PHP
- Redox OS:基於Rust的作業系統Rust作業系統
- 基於websocket的簡單廣播系統Web
- 基於 Prometheus 的監控系統實踐Prometheus
- 基於RBAC的許可權管理系統
- 基於Linux系統的PXE搭建方法Linux
- 基於雙核的雙系統製作
- 基於角色管理的系統訪問控制
- 基於JAVA WEB的醫藥管理系統JavaWeb