分布式消息系统jafka快速起步(转)
Jafka 是一个开源的/性能良好的分布式消息系统。在上一篇文章中有所简单介绍。
下面是一篇简单的入门文档。更多详细的文档参考wiki。
Step 1: 下载最新的安装包
完整的安装指南在这里。
最新的发行版地址在:https://github.com/adyliu/jafka/downloads
$wget https://github.com/downloads/adyliu/jafka/jafka-1.0.tgz
$tar xzf jafka-1.0.tgz
$cd jafka-1.0
可选配置,设置一个环境变量。 $export $JAFKA_HOME=/opt/apps/jafka-1.0 以下假设所有操作目录都在$JAFKA_HOME下。
Step 2: 启动服务端
这里启动一个单进程的服务端,使用默认的配置启动即可。由于一些路径使用了相对路径,因此需要在jafka的主目录下运行。
$bash bin/server-single.sh config/server-single.properties
默认情况下,无需任何配置即可运行服务端。这时服务端会将9092端口绑定到所有网卡上。
Step 3: 发送消息
使用自带的小命令行就可以发送简单的文本消息。
$bin/producer-console.sh --broker-list 0:localhost:9092 --topic demo
> Welcome to jafka
> 中文中国
producer-console.sh有一些参数,这可以通过执行下面的命令得到。 $bin/producer-console.sh
发送消息只需要在提示符号'>'输入文本即可,没有出错意味着发送成功,直接回车或者输入CTRL+C退出程序。
Step 4: 启动消费者
现在是时候消费刚才发送的消息。
同样Jafka自带一个小程序能够消费简单的文本消息。
$bin/simple-consumer-console.sh --topic demo --server jafka://localhost:9092
[1] 26: Welcome to jafka
[2] 48: 中文中国
连接上服务端后,立即就看到有消息消费了。默认情况下simple-consumer-console.sh输出消息的序号(实际上不存在)以及消息的下一个偏移量(offset)。
解压缩后只需要执行上面三条命令就可以完成简单的消息发送和接受演示。这就是一个简单的消息系统。
Step 5: 手动编码
我们希望利用提供的API手动编码能够发送和接受一些消息。
消息发送者
首先写一个简单的消息发送者。
Properties props = new Properties();
props.put("broker.list", "0:127.0.0.1:9092");
props.put("serializer.class", StringEncoder.class.getName());
//
ProducerConfig config = new ProducerConfig(props);
Producer<String, String> producer = new Producer<String, String>(config);
//
StringProducerData data = new StringProducerData("demo");
for(int i=0;i<1000;i++) {
data.add("Hello world #"+i);
}
//
try {
long start = System.currentTimeMillis();
for (int i = 0; i < 100; i++) {
producer.send(data);
}
long cost = System.currentTimeMillis() - start;
System.out.println("send 100000 message cost: "+cost+" ms");
} finally {
producer.close();
}
}
看起来有点复杂,我们简单分解下。
配置参数
首先需要配置服务端的地址。一个jfaka服务端地址格式如下:
brokerId:host:port
- brokerId 用于标识服务进程,这在一个集群里面是全局唯一的
- host/port 用户描述服务监听的ip地址和端口,默认情况下会在所有网卡的9092端口监听数据。
配置完服务端信息后,我们需要提供一个消息编码。
消息编码用于将任意消息类型编码成字节数组,这些字节数组就是我们的消息体。
默认情况下Jafka解析字节数组编码,也就是原封不动的发送出去。这里简单替换下,使用字符串UTF-8编码。
构造消息客户端
使用上面简单的参数就可以构造出来一个简单的消息发送客户端。
消息发送客户端(Producer)用于管理与服务端之间的连接,并将消息按照指定的编码方式发送给服务端。
构造消息
用于使用字符串编码,因此这里只能发送字符串的数据。每一个消息数据包都可以带有多条消息,只需要满足一个消息数据包的大小不超过默认的1M即可。比如下面就构造发往主题为demo的100条消息的数据包:
StringProducerData data = new StringProducerData("demo");
for(int i=0;i<1000;i++) {
data.add("Hello world #"+i);
}
发送消息
最后发送消息只需要调用producer.send()即可。上述例子中循环发送100次。
下面是某次发送的结果:
$bin/run-console.sh demo.client.StaticBrokerSender
send 100000 message cost: 685 ms
消息接受者
接受消息的逻辑非常简单,只需要配置服务端的地址,然后从偏移量0开始顺序消费消息即可。
下面的逻辑是简单的将接受的消息以UTF-8的字符串展示。
//
long offset = 0;
while (true) {
FetchRequest request = new FetchRequest("test", 0, offset);
for (MessageAndOffset msg : consumer.fetch(request)) {
System.out.println(Utils.toString(msg.message.payload(), "UTF-8"));
offset = msg.offset;
}
}
整合ZooKeeper
Jafka 使用zookeeper进行自动broker寻址以及消费者负载均衡。
(1)启动zookeeper服务
测试时可以使用一个单进程的zookeeper用于替换zookeeper集群。
$bin/zookeeper-server.sh config/zookeeper.properties
(2)启动Jafka服务端
[2012-04-24 12:29:56,526] INFO Starting Jafka server
(com.sohu.jafka.server.Server.java:68)[2012-04-24 12:29:56,532] INFO starting log cleaner every 60000 ms (com.sohu.jafka.log.LogManager.java:155)
[2012-04-24 12:29:56,552] INFO connecting to zookeeper: 127.0.0.1:2181 (com.sohu.jafka.server.Zookeeper.java:80)
[2012-04-24 12:29:56,568] INFO Starting ZkClient event thread. (com.github.zkclient.ZkEventThread.java:64)
服务端启动后自动向zookeeper注册服务端的信息,例如ip地址、端口、已存在的消息等。
(3)启动消息发送者
Enter you message and exit with empty string.
> Jafka second day
> Jafka use zookeeper to search brokers and consumers
>
和上面启动的消息发送者类似,只不过这里使用zookeeper配置自动寻找服务端,而不是指定服务端地址。
(4)启动消息接受者
Jafka second day
Jafka use zookeeper to search brokers and consumers
这时候很快就看到刚才发送的消息了。
由于使用zookeeper作为配置中心,因此可以启动更多的服务端、消息发送者、消息接受者。只需要保证都连接zookeeper,并且所有的服务端都有唯一的brokerId(位于server.properties中).
(5)API使用
上面是使用自带的程序发送简单的文本消息。这里利用API来进行开发。
发送消息
Properties props = new Properties();
props.put("zk.connect", "localhost:2181");
props.put("serializer.class", StringEncoder.class.getName());
//
ProducerConfig config = new ProducerConfig(props);
Producer<String, String> producer = new Producer<String, String>(config);
//
StringProducerData data = new StringProducerData("demo");
for(int i=0;i<100;i++) {
data.add("Hello world #"+i);
}
//
try {
long start = System.currentTimeMillis();
for (int i = 0; i < 100; i++) {
producer.send(data);
}
long cost = System.currentTimeMillis() - start;
System.out.println("send 10000 message cost: "+cost+" ms");
} finally {
producer.close();
}
}
和不使用zookeeper的消息发送者对比,只需要将服务端配置信息替换成zookeeper连接地址即可。其它完全一致。
接收消息
接受消息看起来稍微有点复杂,简单来说是如下几步:
- 配置zookeeper以及客户端groupid
- 与服务端的连接
- 创建消息流
- 启动线程池消费消息
Properties props = new Properties();
props.put("zk.connect", "localhost:2181");
props.put("groupid", "test_group");
//
ConsumerConfig consumerConfig = new ConsumerConfig(props);
ConsumerConnector connector = Consumer.create(consumerConfig);
//
Map<String, List<MessageStream<String>>> topicMessageStreams = connector.createMessageStreams(ImmutableMap.of("demo", 2), new StringDecoder());
List<MessageStream<String>> streams = topicMessageStreams.get("demo");
//
ExecutorService executor = Executors.newFixedThreadPool(2);
final AtomicInteger count = new AtomicInteger();
for (final MessageStream<String> stream : streams) {
executor.submit(new Runnable() {
public void run() {
for (String message : stream) {
System.out.println(count.incrementAndGet() + " => " + message);
}
}
});
}
//
executor.awaitTermination(1, TimeUnit.HOURS);
}
所有消息的消费方式几乎都相同,只是消费的topic名称不同而已。
是不是很简单,动手试试吧
http://www.blogjava.net/xylz/archive/2012/05/11/377938.html
分布式消息系统jafka快速起步(转)的更多相关文章
- 分布式消息系统Jafka入门指南之二
分布式消息系统Jafka入门指南之二 作者:chszs,转载需注明.博客主页:http://blog.csdn.net/chszs 三.Jafka的文件夹结构 1.安装tree命令 $ sudo yu ...
- 分布式消息系统Jafka入门指南
分布式消息系统Jafka入门指南 作者:chszs,转载需注明.博客主页:http://blog.csdn.net/chszs 一.JafkaMQ简单介绍 JafkaMQ是一个分布式的公布/订阅消息系 ...
- [Apache Pulsar] 企业级分布式消息系统-Pulsar快速上手
Pulsar快速上手 前言 如果你还不了解Pulsar消息系统,可以先看上一篇文章 企业级分布式消息系统-Pulsar入门基础 Pulsar客户端支持多个语言,包括Java,Go,Pytho和C++, ...
- [kfaka] Apache Kafka:下一代分布式消息系统
简介 Apache Kafka是分布式发布-订阅消息系统.它最初由LinkedIn公司开发,之后成为Apache项目的一部分.Kafka是一种快速.可扩展的.设计内在就是分布式的,分区的和可复制的提交 ...
- Kafka——分布式消息系统
Kafka——分布式消息系统 架构 Apache Kafka是2010年12月份开源的项目,采用scala语言编写,使用了多种效率优化机制,整体架构比较新颖(push/pull),更适合异构集群. 设 ...
- 分布式消息系统Kafka初步
终于可以写kafka的文章了,Mina的相关文章我已经做了索引,在我的博客中置顶了,大家可以方便的找到.从这一篇开始分布式消息系统的入门. 在我们大量使用分布式数据库.分布式计算集群的时候,是否会遇到 ...
- KAFKA分布式消息系统[转]
KAFKA分布式消息系统 转自:http://blog.chinaunix.net/uid-20196318-id-2420884.html Kafka[1]是linkedin用于日志处理的分布式消 ...
- 分布式消息系统kafka
kafka:一个分布式消息系统 1.背景 最近因为工作需要,调研了追求高吞吐的轻量级消息系统Kafka,打算替换掉线上运行的ActiveMQ,主要是因为明年的预算日流量有十亿,而ActiveMQ的分布 ...
- 一种开源的分布式消息系统Nats
一种开源的分布式消息系统Nats 作者:chszs.未经博主同意不得转载.经许可的转载需注明作者和博客主页:http://blog.csdn.net/chszs 1.NATS介绍 NATS是一个开源的 ...
随机推荐
- poj 1080
http://poj.org/problem?id=1080 知识点 :最长公共子序列 要点: 转移方程 f[i][j] = max{ f[i-i][j]+score[s1[i-1]]['-'], ...
- FormView用法
功能描述: 学生可以对相应学校机构进行投诉建议. form表单 class SuggestForm(forms.Form): TYPE_CHOICES = ( (0, u'学校'), (1, u'学院 ...
- octopress command memo
1 rake new_post rake new_post[title] # Begin a new post in source/_posts 2 rake preview ht ...
- HTTPS的学习总结
HTTPS学习总结 简述 HTTPS对比HTTP就多了一个安全层SSL/TLS,具体就是验证服务端的证书和对内容进行加密. 先来看看HTTP和HTTPS的区别 我用AFN访问http下的httpbin ...
- Maven2的配置文件settings.xml(转)
http://maven.apache.org/settings.html简介: 概览当Maven运行过程中的各种配置,例如pom.xml,不想绑定到一个固定的project或者要分配给用户时,我们使 ...
- 最长回文串(manacher算法)
; ; int p[N]; char str[LEN], tmp[N]; //p[i]表示以str[i]为中心的回文往右延伸的 最长长度 void manacher(char* str, int* p ...
- 数据结构——AVL平衡树
1.是二叉搜索树(Binary Search Tree) 2.树和所有左右子树高度之差为-1,0,1 平衡因子(balance factor) =右子树高度-左子树高度 平衡化旋转: 1.从插入位置向 ...
- [Swust OJ 85]--单向公路(BFS)
题目链接:http://acm.swust.edu.cn/problem/0085/ Time limit(ms): 5000 Memory limit(kb): 65535 Descriptio ...
- ms sql 获取字符串首字母
很久没有编写新文章,现在发布一篇自定义函数,针对于ms sql数据库中需要获取字符串首字母,对于需要的朋友希望对你有用,如果你有更好的方法也可以给我留言.函数如下: --获取字符串首字母 CREATE ...
- Hibernate 多对一
Hibernate的many-to-one 关联. 具体看配置文件: <?xml version="1.0"?> <!DOCTYPE hibernate-mapp ...