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事件非同步
- Backpressure in Reactive Systems 響應式系統的反壓React
- 基於SpringBoot 的CMS系統Spring Boot
- Spring生態系統中的Reactor、WebFlux和RSocket區別? - FranciscoSpringReactWebUX
- 全鏈路營銷|基於事件驅動的流程編排系統 策略中心繫統事件
- Docker Swarm :gRPC 基於 DNS 的負載均衡DockerSwarmRPCDNS負載
- 關於 Laravel 框架事件系統的一點認識Laravel框架事件
- 如何基於gRPC溝通微服務框架RPC微服務框架
- 介紹基於事件的架構事件架構
- 基於python的事件處理模型Python事件模型
- LKCOS:基於程式移植的COS系統
- 基於Linux系統的PXE搭建方法Linux
- 基於雲的MES系統軟體
- 基於thincmf的內容管理系統
- 基於SSM的職員考勤系統SSM
- akka-grpc - 基於akka-http和akka-streams的scala gRPC開發工具RPCHTTP
- Laravel事件系統的使用Laravel事件
- gRPC(四)基礎:gRPC流RPC
- 一種基於事件驅動思想的 SAP 系統整合二次開發方法介紹事件
- 事件系統-z 事件發現事件
- 基於Hive的大資料分析系統Hive大資料
- 基於 Flink CDC 的實時同步系統
- Redox OS:基於Rust的作業系統Rust作業系統
- 基於GitHub Issues的評論系統--gitmentGithub
- 基於 Prometheus 的監控系統實踐Prometheus
- 基於RBAC的許可權管理系統
- 基於thinkphp的會員推廣系統PHP
- 基於TP3.2.3的問答系統!
- 基於websocket的簡單廣播系統Web
- 基於等待事件的效能診斷(轉)事件
- 基於laravel的事件監聽例項Laravel事件
- Vue3響應式系統api 之 ref reactiveVueAPIReact
- Laravel 事件系統Laravel事件
- 基於kubernetes雲作業系統的生態系統 - Kelsey Hightower作業系統
- go基於grpc構建微服務框架-整合opentracingGoRPC微服務框架
- SVNAdmin2 - 基於web的SVN管理系統Web