精华内容
下载资源
问答
  • MQTT Topic通配符匹配规则

    千次阅读 2021-01-15 00:03:40
    示例:Topic名称为love,后面的都是子Topic(下面内容也是) love/you/with/all/my/heart 多层通配符:# 多层通配符有可以表示大于等于0的层次。因此,love/#也可匹配到单独的love,此时#代表0层。在这种语境下...

    层级分隔符:/

    / 用来分割主题树的每一层,并给主题空间提供分等级的结构。当两个通配符在一个主题中出现的时候,主题层次分隔符的使用是很重要的。

    示例:Topic名称为love,后面的都是子Topic(下面内容也是)
    love/you/with/all/my/heart
    

    多层通配符:#

    多层通配符有可以表示大于等于0的层次。因此,love/#也可匹配到单独的love,此时#代表0层。在这种语境下主题层次分隔符/就没有意义了。因为没有可以分的层次。

    多层通配符只可以确定当前层或者下一层。因此,#和love/#都是有效的,但是love#不是有效的。多层通配符一定要是主题树的最后一个字符。比如说,love/#是有效的,但是love/#/with是无效的。

    love/you/#	可匹配如下内容(包括但不限于)
    
    love/you
    love/you/with
    love/you/with/all
    love/you/with/all/my/heart
    love/you/with/all/my/hearts
    

    单层通配符:+

    只匹配主题的一层。

    1. love/you/+  :匹配love/you/with和love/you/and,但是不匹配love/you/with/all/my/heart。
    2. 单层通配符只匹配1层,love/+不匹配love。
    3. 单层通配符可以被用于主题树的任意层级,连带多层通配符。它必须被用在主题层级分隔符/的右边,除非它是指定自己。因此,+和love/+都是有效的,但是love+无效。单层通配符可以用在主题树的末端,也可以用在中间。比如说,love/+和love/+/with都是有效。
    

    注意事项

    1.主题层次分隔符被用来在主题中引入层次。多层的通配符和单层通配符可以被使用,但他们不能被使用来做发布者的消息。
    2.Topic命名尽量见名知意,符合规范,主题名字是大小写敏感的。比如说,love和LOVE是两个不同的主题。
    3./开头会产生一个不同的主题。比如说,/love与love不同。/love匹配"+/+"/+,但不匹配+
    4.不要在任何主题中包含nullUnicode \x0000)字符。
    5.在主题树中,长度被限制于64k内但是在这以内没有限制层级的数目 。
    6.可以有任意数目的根节点;也就是说,可以有任意数目的主题树。
    
    展开全文
  • 本文主要介绍RocketMQ中Topic、Tag、GroupName的概念、设计初衷以及使用方法。 一.Topic 首先看看官方的定义: Topic是生产者在发送消息和消费者在拉取消息的类别。Topic与生产者和消费者之间的关系非常松散。具体...

    本文主要介绍RocketMQ中Topic、Tag、GroupName的概念、设计初衷以及使用方法。

    一.Topic

    首先看看官方的定义:

    Topic是生产者在发送消息和消费者在拉取消息的类别。Topic与生产者和消费者之间的关系非常松散。具体来说,一个Topic可能有0个,一个或多个生产者向它发送消息;相反,一个生产者可以发送不同类型Topic的消息。类似的,消费者组可以订阅一个或多个主题,只要该组的实例保持其订阅一致即可。

    • Topic表示一类消息的集合,每个主题包含若干条消息,每条消息只能属于一个主题,是RocketMQ进行消息订阅的基本单位。 topic:message 1:n message:topic 1:1
    • 一个生产者可以同时发送多种Topic的消息;而一个消费者只对某种特定的Topic感兴趣,即只可以订阅
      和消费一种Topic的消息。 producer:topic 1:n consumer:topic 1:1

    在这里插入图片描述

    在Producer中使用Topic:

    Message msg = new Message("TopicTest" /* Topic */,
                        "TagA",("Hello RocketMQ " + i).getBytes(RemotingHelper.DEFAULT_CHARSET));
    

    在Consumer中订阅Topic:

    consumer.subscribe("TopicTest", "*");
    

    个人理解:

    Topic 就是业务分类。一个Topic可以绑定在多个Broker上,生产者发送消息时,按照一定的策略发送到一个Broker上去

    二.Tag

    同样,先看看官方怎么定义的:

    标签,换句话的意思就是子主题,为用户提供了额外的灵活性。有了标签,来自同一业务模块的具有不同目的的消息可以具有相同的主题和不同的标记。标签有助于保持代码的清晰和连贯,同时标签也方便RocketMQ提供的查询功能。

    为消息设置的标签,用于同一主题下区分不同类型的消息。来自同一业务单元的消息,可以根据不同业务目的在同一主题下设置不同标签。标签能够有效地保持代码的清晰度和连贯性,并优化RocketMQ提供的查询系统。消费者可以根据Tag实现对不同子主题的不同消费逻辑,实现更好的扩展性。
    Topic是消息的一级分类,Tag是消息的二级分类。

    • Topic:货物

      • tag=上海
      • tag=江苏
      • tag=浙江
        ------- 消费者 -----
        topic=货物 tag = 上海
        topic=货物 tag = 上海|浙江
        topic=货物 tag = *

      在Producer中使用Tag:

    Message msg = new Message("TopicTest",
                        "TagA" /* Tag */,
                        ("Hello RocketMQ " + i).getBytes(RemotingHelper.DEFAULT_CHARSET));
    

    在Consumer中订阅Tag:

    // * 代表订阅Topic下的所有消息
    consumer.subscribe("TopicTest", "TagA||TagB");
    

    三.GroupName

    和现实世界中一样,RocketMQ中也有组的概念。代表具有相同角色的生产者组合或消费者组合,称为生产者组或消费者组。

    作用是在集群HA的情况下,一个生产者down之后,本地事务回滚后,可以继续联系该组下的另外一个生产者实例,不至于导致业务走不下去。在消费者组中,可以实现消息消费的负载均衡和消息容错目标。

    另外,有了GroupName,在集群下,动态扩展容量很方便。只需要在新加的机器中,配置相同的GroupName。启动后,就立即能加入到所在的群组中,参与消息生产或消费。

    在Producer中使用GroupName:

    // 使用GroupName来初始化Producer,如果不指定,就会使用默认的名字:DEFAULT_PRODUCER
    DefaultMQProducer producer = new DefaultMQProducer("group_name_1");
    

    在Consumer中使用GroupName:

    // 使用GroupName来初始化Consumer,如果不指定,就会使用默认的名字:DEFAULT_CONSUMER
    DefaultMQPushConsumer consumer = new DefaultMQPushConsumer("group_name_1");
    

    RocketMQ使用Topic、Tag和GroupName简单的3个概念,就能实现这些功能,敬佩实现它的作者们。

    四. Queue

    存储消息的物理实体。一个Topic中可以包含多个Queue,每个Queue中存放的就是该Topic的消息。一个Topic的Queue也被称为一个Topic中消息的分区(Partition)。

    一个Topic的Queue中的消息只能被一个消费者组中的一个消费者消费。或者一个Queue中的消息不允许同一个消费者组中的多个消费者同时消费。
    在这里插入图片描述
    在学习参考其它相关资料时,还会看到一个概念:分片(Sharding)。分片不同于分区。在RocketMQ中,分片指的是存放相应Topic的Broker。每个分片中会创建出相应数量的分区,即Queue,每个Queue的大小都是相同的。

    在这里插入图片描述

    既然Topic是队列的名字,那么queue就表示真实操作的队列了。一开始的时候一个Topic就对应一个queue,多好,一个是名字、一个是现实。可是用着用着就悲催了,为啥?消息操作太多了,全都怼在一个小队列上。为了提高效率,咋整??RocketMQ是这样做的,一个Topic绑定的是一组queue,这样每个queue分摊部分压力,性能就上去了。

    读队列个数:可以用来读取数据的队列个数

    写队列个数:可以用来写入数据的队列个数

    queue:真实存储数据用的队列。

    在创建或更改topic时,需要配置writeQueueNums和readQueueNums数,这里的读写队列有什么作用?

    初识rocketmq的童鞋,很容易把读写队列和读写分离混淆在一起。其实在rocketmq里是完全不同的两个概念。读写分离,是用HA机制,将一个节点的数据同步到另外一个节点,主节点多用于写(也可读),从节点只用于读。往往一主多从,通过读写分离减轻系统压力。

    读写队列,则是在做路由信息时使用。在消息发送时,使用写队列个数返回路由信息,而消息消费时按照读队列个数返回路由信息。在物理文件层面,只有写队列才会创建文件。举个例子:写队列个数是8,设置的读队列个数是4.这个时候,会创建8个文件夹,代表0 1 2 3 4 5 6 7,但在消息消费时,路由信息只返回4,在具体拉取消息时,就只会消费0 1 2 3这4个队列中的消息,4 5 6 7中的信息压根就不会被消费。反过来,如果写队列个数是4,读队列个数是8,在生产消息时只会往0 1 2 3中生产消息,消费消息时则会从0 1 2 3 4 5 6 7所有的队列中消费,当然 4 5 6 7中压根就没有消息 ,假设消费group有两个消费者,事实上只有第一个消费者在真正的消费消息(0 1 2 3),第二个消费者压根就消费不到消息。

    由此可见,只有readQueueNums>=writeQueueNums,程序才能正常进行。最佳实践是readQueueNums=writeQueueNums。那rocketmq为什么要区分读写队列呢?直接强制readQueueNums=writeQueueNums,不就没有问题了吗?

    rocketmq设置读写队列数的目的在于方便队列的缩容和扩容。思考一个问题,一个topic在每个broker上创建了128个队列,现在需要将队列缩容到64个,怎么做才能100%不会丢失消息,并且无需重启应用程序?

    最佳实践:先缩容写队列128->64,写队列由0 1 2 …127缩至 0 1 2 …63。等到64 65 66…127中的消息全部消费完后,再缩容读队列128->64.(同时缩容写队列和读队列可能会导致部分消息未被消费)

    五 消息标识(MessageId/Key)

    RocketMQ中每个消息拥有唯一的MessageId,且可以携带具有业务标识的Key,以方便对消息的查询。
    不过需要注意的是,MessageId有两个:在生产者send()消息时会自动生成一个MessageId(msgId),当消息到达Broker后,Broker也会自动生成一个MessageId(offsetMsgId)。msgId、offsetMsgId与key都称为消息标识。

    • msgId:由producer端生成,其生成规则为:
    • producerIp + 进程pid + MessageClientIDSetter类的ClassLoader的hashCode + 当前时间 + AutomicInteger自增计数器
    • offsetMsgId:由broker端生成,其生成规则为: brokerIp + 物理分区的offset(Queue中的偏移量)
    • key:由用户指定的业务相关的唯一标识
      1 Producer
      消息生产者,负责生产消息。Producer通过MQ的负载均衡模块选择相应的Broker集群队列进行消息投
      递,投递的过程支持快速失败并且低延迟。
      例如,业务系统产生的日志写入到MQ的过程,就是消息生产的过程
      再如,电商平台中用户提交的秒杀请求写入到MQ的过程,就是消息生产的过程
      RocketMQ中的消息生产者都是以生产者组(Producer Group)的形式出现的。生产者组是同一类生产
      者的集合,这类Producer发送相同Topic类型的消息。一个生产者组可以同时发送多个主题的消息。

    六、系统架构

    在这里插入图片描述
    RocketMQ架构上主要分为四部分构成:

    1 Producer

    消息生产者,负责生产消息。Producer通过MQ的负载均衡模块选择相应的Broker集群队列进行消息投递,投递的过程支持快速失败并且低延迟。

    例如,业务系统产生的日志写入到MQ的过程,就是消息生产的过程
    再如,电商平台中用户提交的秒杀请求写入到MQ的过程,就是消息生产的过程

    RocketMQ中的消息生产者都是以生产者组(Producer Group)的形式出现的。生产者组是同一类生产者的集合,这类Producer发送相同Topic类型的消息。一个生产者组可以同时发送多个主题的消息。

    2 Consumer

    消息消费者,负责消费消息。一个消息消费者会从Broker服务器中获取到消息,并对消息进行相关业务处理。

    例如,QoS系统从MQ中读取日志,并对日志进行解析处理的过程就是消息消费的过程。
    再如,电商平台的业务系统从MQ中读取到秒杀请求,并对请求进行处理的过程就是消息消费的过程。

    RocketMQ中的消息消费者都是以消费者组(Consumer Group)的形式出现的。消费者组是同一类消费者的集合,这类Consumer消费的是同一个Topic类型的消息。消费者组使得在消息消费方面,实现负载均衡(将一个Topic中的不同的Queue平均分配给同一个Consumer Group的不同的Consumer,注
    意,并不是将消息负载均衡)和容错(一个Consmer挂了,该Consumer Group中的其它Consumer可
    以接着消费原Consumer消费的Queue)的目标变得非常容易。
    在这里插入图片描述
    消费者组中Consumer的数量应该小于等于订阅Topic的Queue数量。如果超出Queue数量,则多出的Consumer将不能消费消息。
    在这里插入图片描述
    不过,一个Topic类型的消息可以被多个消费者组同时消费。
    注意,

    • 1)消费者组只能消费一个Topic的消息,不能同时消费多个Topic消息
    • 2)一个消费者组中的消费者必须订阅完全相同的Topic
    展开全文
  • MQTT-Topic 主题通配符

    千次阅读 2020-12-08 10:39:20
    使用顶层分隔符在主题中引入结构概念,因此能够为达到该目标,在主题内指定。多层通配符与单层通配符可用于订阅但是不能用于消息发布方的主题内。 顶层分隔符 前向/用于分隔主题树内不同层次,为主题空间提供...

    注:   单层通配符和多层通配符只能用于订阅(subscribe)消息而不能用于发布(publish)消息,层级分隔符两种情况下均可使用。

    订阅也许会包含特殊字符,允许一次订阅多个主题。

         使用顶层分隔符意在主题中引入结构概念,因此能够为达到该目标,在主题内指定。多层通配符与单层通配符可用于订阅但是不能用于消息发布方的主题内。

    顶层分隔符

         前向/用于分隔主题树内不同层次,为主题空间提供层次化的结构。当订阅者指定主题遇到两个通配符时,使用顶层分隔符是十分重要的。

    多层通配符

             #号可以匹配主题内任何层次,例如,订阅finance/stock/ibm/#,可以在以下主题上接收到消息:

         finance/stock/ibm

         finance/stock/ibm/closingprice

         finance/stock/ibm/currentprice

    多层通配符可以代表零或多个层次,因此,finance/#也能够匹配单一finance,其中#代表零层次。顶层分隔符在该上下文环境中是无意义的,因为无层次进行分隔。

         可以指定多层通配符仅仅自己或者在顶层分隔符之后。因此,#与finance/#都是有效的,但是finance#无效。多层通配符在主题树内必须是最后一个使用字符,例如finance/#有效,但是finance/#/closingprice无效。

    单层通配符

         +号仅仅匹配一个主题层次。例如,finance/stock/+匹配finance/stock/ibm与finance/stock/xyz,但是不匹配finance/stock/ibm/closingprice。因为单层次通配符仅仅匹配一个层次,finance/+不匹配finance。

         单层次通配符可用于主题树内任何层次,并与多层次通配符一起使用。必须用于在顶层分隔符之后,除了当自己指定时。因此,+和finance/+ 都是有效的,但是finance+无效。单层通配符可用于主题树最后或者在主题树内,例如,finance/+与finance/+/ibm都是有效的。

     

    主题语义与用法

         搭建一个应用程序时,主题树设计应当考虑以下主题名称语法与语义原则:

    主体必须至少一个字符;

    主题名称大小写敏感,例如,ACCOUNTS与Accounts应当为两个不同主题;

    主题名称可以包括空白字符,例如,Accounts payable为有效主题;

    前导/创建一个独立主题,例如,/finance不同于finance,/finance匹配+/+和/+,但不是+;

    主题内不要包括空字符(Unicode \x 0000)

    展开全文
  • 每日掏心话 学会从容,应保持一颗健康向上的心、一种怡然自得的度、一个活出真性的、一种活得潇洒的容、一片泰然自若的情! 责编:乐乐 | 来自:blog.csdn.net/qq_35457078/article/details/88838511 编程技术...

    推荐大家关注一个公众号

    点击上方 "编程技术圈"关注, 星标或置顶一起成长

    后台回复“大礼包”有惊喜礼包!

    日英文

    Three regrets in life: don't choose; Don't stick to choose; Constantly choose.

    人生三大遗憾:不会选择;不坚持选择;不断地选择。

    每日掏心话

    学会从容,应保持一颗健康向上的心、一种怡然自得的度、一个活出真性的意、一种活得潇洒的容、一片泰然自若的情!
    责编:乐乐 | 来自:blog.csdn.net/qq_35457078/article/details/88838511
    

    编程技术圈(ID:study_tech)第 1321次推文

    往日回顾:为什么有些大公司技术弱爆了?

    展开全文
  • 为保证producer发送的数据,能可靠的发送到指定的topictopic的每个partition收到producer发送的数据后,都需要向producer发送ack(acknowledgement确认收到),如果producer收到ack,就会进行下一轮的发送,否则...
  • Topic-Aware Deep Compositional Models for Sentence Classification (论文解读) IEEE/ACM Transactions on Audio, Speech and Language Processing Rui Zhao and Kezhi Mao 论文模型:TopCNN、TopLSTMs. ...
  • 为了保证producer发送的数据,能可靠的发送到指定的topictopic的每个partition收到producer发送的数据后,都需要向producer发送ack(acknowledgement 表示确认收到),如果producer收到ack,就会进行下一轮的发送...
  • 3.Fanout模式:为广播模式,可以同时分发到绑定交换机的所有接收器。 RabbitMQ中编写了3个消息队列,把其都绑定在交换机上。 @Configuration /** * 广播模式 Fanout */ public class FanoutRabbitConfig { ...
  • 对于更为详细的计算圈复杂度的方法,可以看看IBM的文档: https://www.ibm.com/docs/en/raa/6.1?topic=metrics-cyclomatic-complexity 显然,圈复杂度较低的程序更容易理解,修改的风险也更小。 意面指数 度量一份...
  • 百度百科这样介绍主题模型,主题模型(topic model)是以非监督学习的方式对文集的隐含语义结构(latent semantic structure)进行聚类(clustering)的统计模型。 简而言之,就是能够获取文本的隐含语义,例如...
  • 平台包含了超过2.3亿学术论文/专利和1.36亿学者的科技图谱,提供学者评价、专家发现、智能指派、学术地图等科技情报专业化服务。...必读论文:https://www.aminer.cn/topic 自然语言生成(NLG)是自.
  • 这里约定一下,{} 表示RSA加密后的内容,[ | ]表示用什么密钥和算法进行加密,后面的示例中都用这种表示方式,例如上面的 {你好,我是服务器}[私钥|RSA]** 就表示用私钥对 “你好,我是服务器” 进行加密后的结果...
  • 汉语句子的群和重音 我们将讨论一种存储和处理信息的方法,并分享有关在此新范例中创建开发平台的一些想法。 做什么的? 要更快地开发并缩短迭代时间:勾画您的项目,确保它符合您的想法,对其进行优化,然后继续...
  • Cplusplus topic

    2007-04-22 07:54:00
    既然malloc和free对构造函数和析构函数一无所知,把malloc/free和new/delete混起来用又象嘈杂拥挤的晚会那样难以控制,那么,你最好就什么时候都一心一地使用new和delete吧。   条款4:尽量使用c++风格的注释 ...
  • 1.Kafka工作流程 Kafka中的消息是以topic进行分类的,生产者生产消息,消费者消费消息,都是...
  • 需要注意的是换行,是根据输出内容之间的空白符,如果一个字符串中没有空格等字符,即字符长度是为一个单词则会出现这样的问题--没有自动进行换行,这正是word之 4)scaledContents bool:缩放内容,此属性如果在...
  • 后来经历了网易博客改版,新版的风格更加的个性化,但是不合我,所以就逐渐疏离了网易。这个期间,好奇主导一切。 到大学后某一次在网吧时偶然点到了一个免费建站的链接,然后发现网站是比博客更自由的地方。...
  • kafka

    2020-05-05 09:39:28
    Leader维护了一个动态的in-sync replica set (ISR),为和leader保持同步的follower集合。当ISR中的follower完成数据的同步之后,leader就会给producer发送ack。如果follower长时间未向leader同步数据,则该...
  • 启动流程 订阅主题 DefaultMQPushConsumer public void subscribe(String topic, String subExpression) throws MQClientException { this.defaultMQPushConsumerImpl.subscribe(withNamespace(topic), ...
  • 倒装: 凡是倒装都有表"强调"之 英语语法中有个"倒装"的概念. 倒装可表强调(凡是倒装都可以表示强调) 当强调什么时, 就把什么放置到前面. Little do people take into account the seriousness of this problem. It...
  • Log4j2使用教程

    千次阅读 2016-09-21 14:57:14
    Log4j 2的好处就不和大家说了,如果你搜了2,说明你对他已经有一定的了解,并且想用它,所以这里直接就上手了。  1. 去官方下载log4j 2,导入jar包,基本上你只需要导入下面两个jar包就可以了(xx是乱七八糟的版本号...
  • 称之为发生了竞态条件 为了避免临界区内竞态条件发生,有两种主要手段,阻塞式(采用synchronized,lock)和非阻塞式(原子变量) 而此篇介绍的线程八锁指的是使用synchronized关键字对对象加锁的8种情况,在说明...
  • 消息队列之Kafka从入门到小牛

    千次阅读 多人点赞 2021-08-04 01:02:55
    目录 一、Kafka 介绍 1.1 消息队列的介绍 1.2 ...Topic:显示当前的 topic 名称、Partition:显示当前 topic 的 partition 编号、Leader:Leader partition 所在的节点编号,这个编号其实就是 broker.id 的值,来看这个...
  • Kafka架构深入

    2021-01-12 19:39:23
    Kafka中消息是以topic 进行分类的,生产者生产消息,消费者消费消息,都是面向topic的。 topic是逻辑上的概念,而partition是物理上的概念,每个partition对应于一个log(data)文件,该log文件中存储的就是producer...
  • 根据前面的算法即LSA,PLSA我们知道只要知道隐分类(主题、topic)那么文本其他计算就简单了,因此这里我们第二个目标就不详细的讲解,本节详细介绍LDA的训练算法,当然,我只是把训练算法的思路讲一下,具体细节...
  • 例如矩阵的奇异值分解后得到两个矩阵的情况(下图),第一个矩阵的行是item(主题、电影、单词),列是隐分类或是topic或者抽象的特征等等称号,第二个矩阵的行是隐分类或是topic或者抽象的特征等等称号,列就是user...
  • 目录 消息的消费(订阅全部) ...订阅时,我们设置通配符“*”意味订阅topic匹配的全部消息 package cn.itcast.rocketmq.consumer; import org.apache.rocketmq.client.consumer.DefaultMQPushConsumer; imp...
  • https://developer.apple.com/library/ios/navigation/#section=Resource%20Types&topic=Guides​ 3、WWDC视频资料 文本文档的技术文档看腻了?别怕,Apple是个人性化的公司,他们每年举办的WWDC,Apple的...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 3,994
精华内容 1,597
关键字:

topic意