使用 SQL 的方式查询消息队列数据以及踩坑指南

8f556bfa3a03dc910470e1b9ca2d9477.png

Pulsar-sql.png

背景

为了让业务团队可以更好的跟踪自己消息的生产和消费状态,需要一个类似于表格视图的消息列表,用户可以直观的看到发送的消息;同时点击详情后也能查到消息的整个轨迹。

消息列表a136aba5bac6cd01d31483bc63ae659c.png

点击详情后查看轨迹afb1ab4d896a5267ef0c899211140d70.png

原理介绍

由于 Pulsar 并没有关系型数据库中表的概念,所有的数据都是存储在 Bookkeeper 中,为了模拟使用 SQL 查询的效果 Pulsar 提供了 Presto (现在已经更名为 Trino)的插件。

Trino 是一个分布式的 SQL 查询引擎,它也提供了插件能力,如果我们想通过 SQL 从自定义数据源查询数据时,基于它的 SPI 编写一个插件是很方便的。

这样便可以类似于查询数据库一样查询 Pulsar 数据:f51dec3aaf8cb00e67515ad343cbad54.png


9d027ef6cfc3e8d75781d8f18db5ea93.pngPulsar 插件的运行流程如上图所示:

  • 启动的时候通过 Pulsar-Admin 接口获取一些元数据,比如 Scheme,topic 分区信息等。

  • 然后会创建一个只读的 Bookkeeper 客户端,用于获取数据。

  • 之后根据 SQL 条件过滤数据即可。

相关代码:1beb8f1e4c189e743c051657aec023aa.pngb6e9539bc95d3ad512c47abdd1348a2c.png

使用 Pulsar-SQL

210476237148c3e7bd98664f76671f05.png
image.png

使用起来也很简单,官方提供了两个命令:

  • sql-worker: 会启动一个 trino 服务端同时运行了 Pulsar 插件

  • sql: 就是一个 SQL 命令行终端。

遇到的问题

自己在本地运行的时候自然是没问题,可是一旦想在生产运行,同时如果你的 Pulsar 集群是运行再 k8s 环境中时就会碰到一些问题。

无法使用现有 Trino 集群

首先第一个问题是如果生产环境已经有了一个 Trino 集群想要复用的时候就会碰到问题,常规流程是将 Pulsar 的插件复制到 TrinoPlugin 目录,然后重启 Trino 后就能使用该插件。

当然社区也是支持这么做的:2d450f8e1cb004d04d3e8a6c342c62bc.png但是当我将 Pulsar-plugin 复制到 Trino 中运行的时候却失败了,整体的流程可以参考这个 issue:https://github.com/apache/pulsar/discussions/20941

简单来说 Trino 的官方镜像和 pulsar-plugin 并不能兼容,这个问题直接影响到我们是否可以在生产环境使用它。

但是手动编译出来的 Trino 服务和插件是兼容的,可以直接运行。

f8e36d7f661fe086409525666de9e4b7.png
image.png

因此我只能在本地编译出 Trino 服务端和 pulsar-plugin 然后打包成一个镜像来运行了,当然这样的坏处就是无法利用到我们现有的 Trino 集群,又得重新部署一个了。

bbb66561c87e863d407c90b0e60fccf6.png
image.png

流程也比较麻烦:

  • 首先是本地编译 Pulsar-SQL 模块

  • 将生成物复制到当前目录

  • 执行 make docker 打出 docker 镜像并上传到私服

  • 再执行 kubectl 将 trino 部署到 k8s 环境中

整个流程做下来加上和社区的沟通,更加确定这个功能应该是很少有人在生产环境使用的,毕竟第一个坑就很麻烦,更别提后续的问题了😂。

Presto 插件不支持 AuthToken

第二个问题也是个深坑,当我把 Trino 部署好查询数据的时候直接抛了一个调用 pulsar-admin  接口连接超时的异常。

结果排查了半天发现原来是 pulsar-plugin 里没有提供 JWT 的验证方式,而我们的 Pulsar 集群恰好是打开了 JWT 验证的。

为此我只能先在本地修复了这个问题,同时也提交了 PR,预计会在下一个大版本合并吧:https://github.com/apache/pulsar/pull/20860

新创建的 topic 查询失败

第二个问题是当查询一个新创建的 topic 时,客户端会直接 block,相关的复现流程在这里:https://github.com/apache/pulsar/issues/20910

fb46b0122502b7debcd14dd3dfdfe7dd.png
image.png

这个问题还好,不是很致命,是我在本地测试的时候无意间发现的。

本地我已经修复了,后面也提交了一个 PR,目前还在讨论中:https://github.com/apache/pulsar/pull/20911

查询消息会丢失最后一条

这个问题也不是很严重,数据量少的时候会发现,就是在指定了消息发送时间的查询条件时,最后一条消息会被过滤掉,相关 issue 在这里:https://github.com/apache/pulsar/issues/20919ed26005299d3f6e7b6abbbcaf97c8176.png这个我只是定位到了原因,但不太清楚 为什么要这么做(-1),影响也不是很大,就放在这里搁置了。

Schema 不兼容

最后发现的一个问题是我们线上某些 topic 查询数据的时候会抛出 Not a record: "string"的异常,但只是部分 topic,也排查了很久,整个源码中没有任何一个地方有这个异常。

https://github.com/apache/pulsar/issues/20945

436d631efed75a66e69beadd7a3c4a1c.png
image.png

根本原因是生产者生成的 schema 有问题,类型已经是 JSON 了,但是 schema 却是 string,这样导致 pulsar-plugin  在反序列化 schema 的时候抛出了异常,由于是 pb 反序列化抛出的异常,所以源码中都搜索不到。

没有问题的 topic 使用了正确的 schema

后续我也在本地修复了这个问题,当抛出异常后就将 schema 降级为基本类型进行解析。35c5dbe07ba160a9d479036bc4c05b4f.png

不过本质问题还是客户端使用有误,如果对 schema 理解不准确的话还是建议使用 byte[] 吧,这样至少兼容性不会有问题。相关 PR:https://github.com/apache/pulsar/pull/20955

总结

Pulsar-SQL 是一个非常有用的功能,只是我们使用过程中确实发现了一些问题,大部分都已经修复了;希望对后续使用该功能的朋友有所帮助。#Pulsar

PS:最近也在做视频相关的教程,感兴趣的朋友可以关注下面的视频号:

往期推荐

VictoriaLogs:一款超低占用的 ElasticSearch 替代方案

k8s 常见面试题

新手如何快速参与开源项目

从 Pulsar Client 的原理到它的监控面板

51fbeb148fb50b1099f9ebb6ac10558b.gif

点分享

36d645285486ed108c8c59bf774255b8.gif

点收藏

360b8e75134d3466f08fd1bb73e9a74a.gif

点点赞

89bcdc076dabab63acf1c140e49c00de.gif

点在看

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/66987.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MyBatis关联关系映射详解

前言 在使用MyBatis进行数据库操作时,关联关系映射是一个非常重要的概念。它允许我们在数据库表之间建立关联,并通过对象之间的关系来进行数据查询和操作。本文将详细介绍MyBatis中的关联关系映射,包括一对一、一对多和多对多关系的处理方法…

Spring MVC:域对象共享数据

Spring MVC 前言域对象共享数据使用 ModelAndView 向 request 域对象中共享数据使用 Map 、Model 或 ModelMap 向 request 域对象中共享数据使用 SesionAttributes 注解向 session 域对象中共享数据使用 Servlet API 向 application 域对象中共享数据 附 前言 在上一章中&…

Linux搭建GitLab私有仓库,并内网穿透实现公网访问

目录 前言 1.下载Gitlab 2.安装Gitlab 3.启动Gitlab 4.安装cpolar 5. 创建隧道配置访问地址 6.固定GitLab访问地址 7. 配置二级子域名 8. 测试访问二级子域名 前言 GitLab 是一个用于仓库管理系统的开源项目,使用Git作为代码管理工具,并在此基…

问道管理:什么是大盘?大盘股又是什么?

聊到股市就免不了聊到大盘,有些新进场的投资者对此或许带有疑问,什么是大盘?我们所说的大盘股又是什么?关于这些,问道管理为我们准备了以下参考内容。 什么是大盘? 大盘,主要是指股市的整体行情…

python-数据分析-numpy、pandas、matplotlib的常用方法

一、numpy import numpy as np1.numpy 数组 和 list 的区别 输出方式不同 里面包含的元素类型 2.构造并访问二维数组 使用 索引/切片 访问ndarray元素 切片 左闭右开 np.array(list) 3.快捷构造高维数组 np.arange() np.random.randn() - - - 服从标准正态分布- - - …

CSS 一个好玩的卡片“开卡效果”

文章目录 一、用到的一些CSS技术二、实现效果三、代码 一、用到的一些CSS技术 渐变 conic-gradientbox-shadowclip-path变换、过渡 transform、transition动画 animation keyframes伪类、伪元素 :hover、::before、::after …绝对布局。。。 clip-path 生成网站 https://techb…

Yjs + Quill 实现文档多人协同编辑器开发(基础+实战)

前言 多人协同开发确实是比较难的知识点,在技术实现上有一定挑战,但随着各种技术库的发展,目前已经有了比较成熟的解决方案。今介绍 Yjs 基于CRDT算法,用于构建自动同步的协作应用程序,与Quill富文本编辑器&#xff0c…

从零开始学习 Java:简单易懂的入门指南之Collection集合及list集合(二十一)

Collection集合及list集合 1.Collection集合1.1数组和集合的区别1.2集合类体系结构1.3Collection 集合概述和使用1.4Collection集合的遍历1.4.1 迭代器遍历1.4.2 增强for1.4.3 lambda表达式 2.List集合2.1List集合的概述和特点2.2List集合的特有方法2.3List集合的五种遍历方式2…

仓库运行状况如何得知?数据挖掘是关键!

库存、订单、出入库记录、物流信息、货物状态等数据,是仓库管理的重要组成部分。 仓库数据的重要性 做好仓库数据管理对企业的重要性不言而喻。通过有效地管理数据,企业可以更好地了解市场需求和库存情况,快速响应市场变化,提高库…

医院小程序如何在线搭建?实战解析

在当今数字化时代,移动应用程序成为我们生活中必不可少的一部分。特别是在医疗领域,移动应用程序的需求更为迫切。为了满足这一需求,开发一个医疗小程序成为了许多医疗机构的优先选择。 在本文中,我们将分享一个实战攻略&#xff…

iOS开发Swift-5-自动布局AutoLayout-摇骰子App

1.在iOS坐标系中,以向左、向下为正方向。图片以左上角为基准点。 2.打开之前的摇骰子App,对它的界面做一些适应所有iPhone机型的效果。 3.先对上方logo做一个y轴约束和一个宽高约束。 宽高约束: 水平居中: 对y轴进行约束。将虚线点…

WebDAV之π-Disk派盘 + 思源笔记

思源笔记是一款隐私优先的个人知识管理系统,支持完全离线使用,同时也支持端到端加密同步。 融合块、大纲和双向链接,重构你的思维。 π-Disk派盘 – 知识管理专家 派盘是一款面向个人和企业的本地云存储解决方案,它可以帮助用户打造“数字第二大脑”,并支持KMS知识管理系…

专访远航汽车远勤山:踏踏实实做好产品 直面挑战乘风远航

8月25日,第二十六届成都国际汽车展览会在中国西部国际博览城隆重开幕。车展举办期间,远航汽车董事长远勤山先生、产品研发总监王震先生向媒体分享了远航汽车品牌发展、产品研发、技术创新以及市场布局等内容。 “通过我们的付出和努力,让我们…

全网最新最全软件测试工程师面试题,看完金九银十还怕拿不到offer?

与开发工程师相比,软件测试工程师前期可能不会太深,但涉及面还是很广的。 在一年左右的实习生或岗位的早期面试中,主要是问一些基本的问题。 涉及到的知识主要包括MySQL数据库的使用、Linux操作系统的使用、软件测试框架问题、测试环境搭建问…

kafka 命令脚本说明以及在java中使用

一、命令行使用 1.1、topic 命令 1、关于topic,这里用window 来示例 bin\windows\kafka-topics.bat2、创建 first topic,五个分区,1个副本 bin\windows\kafka-topics.bat --bootstrap-server localhost:9092 --create --partitions 5 --replication-factor 1 -…

本地缓存、Redis数据缓存策略

目录 需求看似简单,一取一传但是,又出现了一个新的问题,数据丢了。 一、缓存缓存有哪些分类: 二、分析一下本地缓存的优势三、本地缓存解决方案?1、基于Guava Cache实现本地缓存2、基于Caffeine实现本地缓存3、基于Enc…

无涯教程-Flutter - Dart简介

Dart是一种开源通用编程语言,它最初是由Google开发的, Dart是一种具有C样式语法的面向对象的语言,它支持诸如接口,类之类的编程概念,与其他编程语言不同,Dart不支持数组, Dart集合可用于复制数据…

来和稚晖君做同事,校招内推、社招、实习

先上校招官网投递链接和内推码。 投递链接:http://www.agibot.com/ 我的内推码:MVKRCCW 智元机器人开始校招了,众多岗位如下: 公司正在不断发展壮大中,需要优秀的毕业生加入,一块来搞点有意思的事情。稚…

访问 GitHub 方法

访问 GitHub 方法 方法一:最常见的就是 fq,但这个是违法的行为,自己私下搞可以,不能教你们。 方法二:利用加速器,这是正规合法操作。这里推荐一个免费的加速器,下载安装 Watt Toolkit加速器,原名…

spark支持深度学习批量推理

背景 在数据量较大的业务场景中,spark在数据处理、传统机器学习训练、 深度学习相关业务,能取得较明显的效率提升。 本篇围绕spark大数据背景下的推理,介绍一些优雅的使用方式。 spark适用场景 大数据量自定义方法处理、类sql处理传统机器…