0%

  • 初始化仓库
    1
    2
    3
    4
    # 初始化一个 git 仓库并且建立工作目录
    git init
    # 初始化一个干净的仓库,使用 bare 选项不带有工作目录,使用 shared 选项,提供组可写的权限
    git init --bare --shared
  • 克隆仓库
    1
    2
    # 在未指定协议的时候优先会采用 ssh
    git clone [地址]
  • 暂存文件
    将文件提交至暂存区(进入 staged 状态)
    1
    2
    3
    git add [路径]
    # 只暂存所有已经跟踪的文件,这通常可以减少多余文件的提交
    git add -u
    阅读全文 »

新建索引

新建索引很简单,但是需要注意的是:

  • ES 中索引名称不能包含大写字母
  • 不能再次 PUT 一个已经存在的索引
  • ES 默认给索引设置 5 个分片和 1 个副本,该值可以通过 setting 参数域进行修改。其中副本数在索引创建之后支持修改,而分片数无法修改!
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    PUT /person
    # 可选项,不附加请求体的情况下统一使用默认值
    {
    "settings": {
    # 分片数量
    "number_of_shards": 3,
    # 副本数量
    "number_of_replicas": 1
    }
    }
    阅读全文 »

在服务端进行消息过滤,可以减少不必要的流量,提高带宽利用度和吞吐量。
RocketMQ 支持多种方式来进行服务端的消息过滤

消息使用 Tag 标签

作为一条 Message,它有着特定的 Topic,同时也可以指定唯一的 Tag 标记子分类。消费方在订阅消息时候,Broker 可以在指定 Topic 的 ConsumeQueue 下按 Tag 进行过滤,只从 CommitLog 中取出 Tag 命中的消息。

阅读全文 »

日志配置文件位置

RocketMQ 日志基于 slf4j 实现,支持 Logback、Log4j。如果需要指定日志的配置文件的位置有三种方式:

  • 环境变量:
    ROCKETMQ_CLIENT_LOG_CONFIGFILE=<custom-file>
  • 启动参数:
    rocketmq.client.log.configFile=<customer-file>,作为 JVM 变量,启动时时需要增加 -D 标识,优先级也比环境变量更高
  • 作为 Java 实现,日志位置信息是通过 System.getProperty() 或者 System,getenv() 得到的,所以可以在程序入口 System.setProperty(“rocketmq.client.log.configFile”, customer_file) 来配置
阅读全文 »

上一篇介绍完了 RocketMQ 消费者的默认实现,现在来瞅一瞅生产者的用法。

设置必要的属性

同样的,是 DefaultMQProducer,新建实例之后,在使用生产者发送消息之前,需要初始化几个属性:

  • InstanceName 实例名称
    这是为了当一个 JVM 上启动了多个生产者时,区分不同的生产者实例,系统默认名称为 DEFAULT
  • RetryTimesWhenSendFailed 重试次数
    当消息投递失败时,有可能是因为网络原因,可以设置多投递几次减少丢消息的情况。
    很多实用者在使用时,为了避免重复的消息设置不重试是不正确的做法:因为 RocketMQ 本身并不保证消息的不重复,作为客户端对消息进行幂等处理是必要的。而在次前提下,对发送失败的场景拒绝重发,不仅对避免重复消息没有任何意义,同时也增加了消息的丢失的可能。
  • NamesrvAddr
    需要 NameServer 的地址,写法和 Consumer 一致
    阅读全文 »

结束了对 RocketMQ 组件的初步理解以及配置的简单设定,可以对 RocketMQ 仔细研究一番了。先来看看 RocketMQ 的消费者实现,以及服务端是如何处理消费者客户端的请求,把消息送出去的。

RocketMQ 对于消费者客户端,支持推模型和拉模型。对于推模型,由消息服务端作为主动方,向客户端推送消息(尽管其本质是一个长轮询式的拉模型实现);而拉模型由客户端主动拉取消息。

阅读全文 »

RocketMQ 的配置分为两部分,一者是 JVM 的配合,另一者则是对 Broker 应用本身的参数配置。
在初次接触时候,除了 RocketMQ 本身的一些特性,同时也难免会被一些配置给迷惑或者踩坑,这里来看一下通常的配置点。

阅读全文 »

目前被广泛使用的 MQ 有很多,包括 ActiveMQ,Kafka,RabbitMQ,RocketMQ 等等,它们各有长短。而近期所在项目选择了 RocketMQ 作为消息中间件,此前并未系统地了解研究,所以趁此机会整理了一些笔记和想法。

阅读全文 »

MyBatis 作为一个目前很常用的持久化框架,有着丰富的拓展。这些拓展功能常常以插件的形式嵌入到 MyBatis 的运作流程之中,而如何制作实现一个插件?MyBatis 已经为大家设计好了,一个 Interceptor 接口,实现它就够了。

Interceptor 接口的拦截目标,是 MyBatis 运作流程中的几个核心组件:

  • Executor:这是 MyBatis 执行器,控制着所有和数据库交互的操作,也影响着一级缓存。
  • ParameterHandler:参数处理器,在映射参数时候生效。
  • ResultSetHandler:结果集处理器,在处理结果集的时候会用到。
  • StatementHandlerExecutor 下层的处理器,同样控制着 SQL 行为,也控制着二级缓存的生效。
阅读全文 »

Docker 镜像是层层分离的,分为只读的底层和可读写的当前层。容器在运行时候如果有文件改动,会自动从含有该文件的底层拷贝并更新在当前层。如果容器在 commit 之前被销毁,那么有这个镜像重新生成的容器是不包含改动的内容的。

阅读全文 »