pulsar基础第一篇:pulsar安装及基本概念
介绍
Apache Pulsar是一款开源的云原生消息流系统,它提供了统一的消费模型,支持消息队列和流两种场景,既能为队列业务提供企业级的读写服务和强一致性保障,又能为流业务提供高吞吐、低延迟。同时,得益于存储、计算分离的云原生架构设计,以及支持大集群、多租户、百万级Topic、跨地域数据复制等关键特性,Apache Pulsar在越来越多的行业和企业得到广泛使用。
单击安装
docker run --name pulsar -h pulsar -e TZ=Asia/Shanghai -p 6650:6650 -p 8080:8080 --restart=always -d apachepulsar/pulsar:4.0.6 bin/pulsar standalone
其中,6650端口用于生产者、消费者等客户端连接,格式如pulsar://127.0.0.1:6650。8080端口是admin端口,格式如http://127.0.0.1:8080。
数据在容器的/pulsar/data目录,配置文件在容器的/pulsar/conf目录,可以映射出来。
进入容器,修改/pulsar/conf/pulsar_env.sh文件,找到PULSAR_MEM,调整内存使用量,重启容器。
pulsar集群有3个组件:broker集群、bookkeeper集群、元数据存储集群(如zookeeper集群或etcd集群,部署在k8s上时建议使用后者。standalone模式时,元数据放在rocksDB中)。broker是无节点的,broker集群可以随意扩缩容。bookkeeper集群用于存储数据和消费游标。元数据存储地址可以通过metadataStoreUrl配置,如可配置为一个zookeeper集群地址或etcd集群地址。
如果想broker、zookeeper、bookie分开的话,可参考https://pulsar.apache.org/docs/4.0.x/getting-started-docker-compose。
在命令行客户端往my-topic这个topic发送消息:pulsar-client produce my-topic -m "hello-pulsar" -n 2,-n用于发送多此次,-n 2表示发送2次,broker会收到2条数据。
在命令行客户端以first-subscription订阅名消费my-topic中的消息:pulsar-client consume -s "first-subscription" -n 1000 my-topic。-n用于指定最多消费多少条消息,消费完后客户端会自动退出。不设置默认为1。设置为0,表示一直消费。默认订阅类型是Exclusive,可以用-t指定为Failover或者Shared或者Key_Shared,大小写敏感。
在发送消息时,可以设置消息的DeliverAt或者DeliverAfter属性,这样消息就会变成定时消息或者延迟消息。message的key属性用于确定消息会被路由到哪个分区。如果生产者启用了批量发送,则生产者会累计一批消息,然后一次性发给broker。但是定时消息和延时消息不会累计,只会一个个发送。
当生产者启用批量发送后,消费者最好启用批量索引确认,否则如果一个批次的某一条消息确认失败,那么这整个批次将确认失败,这个批次的所有消息将重新消费,会造成消息的重复消费。启用批量索引确认则不会。启用批量索引确认需要在broker上和在创建消费者时同时配置:①在broker上,需要设置acknowledgmentAtBatchIndexLevelEnabled为true。②在创建消费者时,需要设置enableBatchIndexAcknowledgment为true。
通过pulsar-admin namespaces set-persistence --bookkeeper-ensemble 3 --bookkeeper-write-quorum 2 --bookkeeper-ack-quorum 2 test-tenant/namespace1,来设置某namespace中消息的副本情况。--bookkeeper-ensemble指定此namespace的topic要占用的bookies数,--bookkeeper-write-quorum指定消息的副本数,--bookkeeper-ack-quorum指定消息的ack数。假如bookie集群有b1、b2、b3、b4共4个节点,若配置为--bookkeeper-ensemble 3 --bookkeeper-write-quorum 2,则此namespace只会用到其中的3个bookie,可能是b1、b2、b3,也可能是b2、b3、b4,等等,共有4种可能。假如是b1、b2、b3,则此namespace中的topic的消息副本会存储到这三个节点中任意的两个,如topic1的消息可能存储到b1+b2,topic2的消息可能存储到b2+b3,topic3的消息可能存储到b1+b3。。。
默认情况下,pulsar会永久存储那些未被消费的消息,立即删除那些已被消费的消息。https://pulsar.apache.org/docs/4.0.x/cookbooks-retention-expiry
通过pulsar-admin namespaces set-message-ttl -ttl 100 xndm/blackbox,来设置某namespace中未被消费的消息的过期时间,单位默认是s。-ttl单位可以是s、m、h、d、w、y,分别代表秒、分钟、小时、天、周、年,不带的话,认为是秒。设置为0,表示永不过期。ttl可以多次设置,以最新的为准。get-message-ttl会返回一个换算出的秒数。不设置的话,get会返回null。
通过pulsar-admin namespaces set-retention -s -1 -t 7d xndm/blackbox,来设置某namespace中已被消费的消息的保留时间。-s单位可以是k、m、g、t,分别代表kb、mb、gb、tb,不带的话,认为是byte。0表示不保留,-1表示无限。-t单位可以是s、m、h、d、w、y,分别代表秒、分钟、小时、天、周、年,不带的话,认为是秒。0表示不保留,-1表示永远。
ttl过期时间表示消息在订阅中未被消费时,保留多久。retention表示消息在被所有订阅都消费完之后,还要保留多久/多少数据。这两个是完全不同的概念。
堆积限额:backlog-quota
golang版客户端0.16.0,如果在创建生产者时不指定MessageRouter,那么就会用默认的路由器。如果消息指定了key或者orderingKey,那么将根据hash值放入特定的分区中。如果没有指定,那么如果禁用了批量发送,那么将会轮询放入各分区中,否则极有可能会一直放到某一个分区里(有点复杂)。
pulsar支持消息去重,实现原理是:https://pulsar.apache.org/docs/4.0.x/cookbooks-deduplication
设置brokerDeduplicationEnabled=true即可启用。
negative ack:如果消费者negative ack,那么在一段时间后消费者会再次消费此消息,时间由xxx决定。
如果订阅是共享订阅,且retry为true,则当消费者调用reconsumeLater方法后,消息会被放到重试主题中。此时 ,消费者除了会消费原主题外,还会消费这个重试主题。重试主题中的消息,一段时间后会被消费。如果消费者再次调用reconsumeLater,那么会再隔一段时间被消费。。。假如一直调用reconsumeLater,那么当达到一定次数时,消息就会被放到死信主题中。
1、想重复消费消息,需要满足两个条件:①消费者的retry为true。②拿到消息后,消费者negative ack或者调用reconsumeLater方法。
2、想把消息放到重试主题中,需要满足三个条件:1、订阅是共享订阅。2、retry为true。3、消费者调用reconsumeLaterack方法。
3、想把消息放到死信主题中,需要满足三个条件:1、订阅是共享订阅。2、retry为true。3、消费者多次negative ack或者调用reconsumeLater方法。
pulsar有多种订阅类型:
exclusive:一个订阅只能有一个消费者,其他消费者会创建失败。
failover:一个订阅可以有多个消费者,但只有一个消费者能收到消息,其他消费者作为backup。注意,如果主题是分区主题,那么每个分区都会有一个主消费者,这些主消费者可能不一样。如分区有2个分区,订阅有4个消费者A、B、C、D,那么分区1的主消费者可能是A,分区2的主消费者可能是B。
shared:一个订阅可以有多个消费者。主题与消费者构成笛卡尔积。如果主题是分区主题,则各分区与各消费者构成笛卡尔积。如分区有2个分区,订阅有4个消费者A、B、C、D,那么分区1会被A、B、C、D消费,分区2也会被A、B、C、D消费。
key_shared:和shared类似,只不过会额外保证key相同的消息会被同一个消费者消费。当采用key_shared订阅时,生产者需要禁用批量发送或者采用keyBasedBatch。
pulsar消费者除了单个确认(ack)外,还支持累积确认(ackCumulative,连带此消息之前的消息一起确认),但不能用于shared或key_shared,只适用于exclusive和failover。
浙公网安备 33010602011771号