Python 3.8.1 公布

Library

bpo-38944:Excape key现在会关闭IDLE completion windows

 

Python 3.8.1 版本的更新内容如下:

bpo-38943:修复IDLE自动完成窗口不总是出现在某些系统上的问题

  • 消息消费的顺序无法保证
  • 难以控制手动提交offset的时机

(文/开源中国)    

Python 3.8.1版本的更新内容如下:

 

Windows

Windows

   
附:Zookeeper默认会将控制台信息输出到启动路径下的zookeeper.out中,显然在生产环境中我们不能允许Zookeeper这样做,通过如下方法,可以让Zookeeper输出按尺寸切分的日志文件:

  • bpo-39080:当星标表达式 AST
    节点位于 Call AST 节点的 args 属性中的元素之中时,修复它们的
    end_col_offset 值。

  • bpo-39031:解析“elif”节点时,该节点的
    lineno 和 col_offset
    现在指向“elif”关键字,而不是其条件,从而使其与“if”节点一致。

  • bpo-39008:PySys_Audit()现在要求Py_ssize_t将格式字符串中的
    size 参数用作大小参数,而不管 PY_SSIZE_T_CLEAN在包括时定义了什么。

Library

  再次查看Topic状态:

macOS

macOS

 

  • bpo-38944:Excape
    key 现在会关闭 IDLE completion windows

  • bpo-38943:修复 IDLE
    自动完成窗口不总是出现在某些系统上的问题

Tests


照官方文档的说法,advertised.host.name和advertised.port这两个参数用于定义集群向Producer和
Consumer广播的节点host和port,如果不定义的话,会默认使用host.name和port的定义。但在实际应用中,我发现如果不定义
advertised.host.name参数,使用Java客户端从远端连接集群时,会发生连接超时,抛出异
常:org.apache.kafka.common.errors.TimeoutException: Batch Expired 

  • bpo-38546:Multiprocessing 和
    current.futures 测试现在会在测试完成时停止资源跟踪器进程。

bpo-39008:PySys_Audit()现在要求Py_ssize_t将格式字符串中的size参数用作大小参数,而不管PY_SSIZE_T_CLEAN在包括时定义了什么。

    首先解压

Core and Builtins

bpo-39031:解析“elif”节点时,该节点的lineno和col_offset现在指向“elif”关键字,而不是其条件,从而使其与“if”节点一致。

 

  • bpo-38295:防止在 macOS
    Catalina 上的 test_py_compile 中的 test_relative_path 失败。

Core and Builtins

5) 同时启动Producer进程和Consumer进程

  • bpo-39007:将 auditing events
    添加到winreg中的函数。

bpo-38811:修复缺少os.link()时pathlib中未处理的异常。

 

详细信息:

距离Python 3.8.1 rc1发布没多久的时间,目前,Python
3.8.1也已正式发布。Python 3.8.1是Python 3.8的第一个维护版本,Python
3.8系列是Python编程语言的最新主要版本,它包含了许多新功能和优化。

 

IDLE

IDLE

 

  • bpo-39022:更新
    importliib.metadata 以包括对 importlib_metadata 1.3
    的改进,包括更好的 EntryPoints 序列化和改进的自定义查找器文档。

  • bpo-38811:修复缺少os.link()pathlib中未处理的异常。

  • bpo-36406:处理doctest中的
    namespace packages。

bpo-39007:将auditing events添加到winreg中的函数。

 

Tests

图片 1

    此处的坑:

bpo-38295:防止在macOS
Catalina上的test_py_compile中的test_relative_path失败。

  • dataDir和dataLogDir的路径需要在启动前创建好
  • clientPort为zookeeper的服务端口
  • server.0/1/2为zk集群中三个node的信息,定义格式为hostname:port1:port2,其中port1是node间通信使用的端口,port2是node选举使用的端口,需确保三台主机的这两个端口都是互通的

bpo-36406:处理doctest中的namespace packages。

 
乍一看似乎offset乱掉了,但其实这是因为消息分布在了两个分区上,每个分区上的offset其实是正确递增的。

bpo-39022:更新importliib.metadata以包括对importlib_metadata
1.3的改进,包括更好的EntryPoints序列化和改进的自定义查找器文档。

能看到,在broker0挂掉后,consumer也端产生了一系列INFO和WARN输出,但同Producer端一样,若干秒后自动恢复,消息仍然是连续的,并未出现断点。

bpo-39080:当星标表达式AST节点位于Call
AST节点的args属性中的元素之中时,修复它们的end_col_offset值。

 

bpo-38546:Multiprocessing和current.futures测试现在会在测试完成时停止资源跟踪器进程。

 

 

 

 

 

 
原因是Producer端在尝试向broker1的parition0发送消息时,partition0的leader已经切换成了broker0,所以消息发送失败。

  • 可自由控制Worker线程的数量,不受Partition数量限制

 

 

Topic:test PartitionCount:2 ReplicationFactor:2 Configs: 
   Topic: test Partition: 0 Leader: 1 Replicas: 1,0 Isr: 0,1 
   Topic: test Partition: 1 Leader: 0 Replicas: 0,1 Isr: 0,1

4. 使用Kafka的Producer API来完成消息的推送

  1. 解耦,1个Consumer线程负责拉取消息,数个Worker线程负责消费消息
    好处:

  然后再次检查Topic状态:

6) 把broker0干掉,观察Consumer端的输出:

 

Topic:test PartitionCount:2 ReplicationFactor:2 Configs: 
   Topic: test Partition: 0 Leader: 1 Replicas: 1,0 Isr: 1,0 
   Topic: test Partition: 1 Leader: 1 Replicas: 0,1 Isr: 1,0

bin/kafka-topics.sh --describe --zookeeper 10.0.0.100:2181,10.0.0.101:2181,10.0.0.102:2181 --topic test

    创建完成后,使用如下命令查看Topic状态:

 

  运行输出:

  输出:

tar -xzvf zookeeper-3.4.6.tar.gz

    zookeeper.root.logger=INFO, ROLLINGFILE

3) 登录SSH将broker0,也就是partition 1的leader kill掉

    此处的坑:

bin/zkServer.sh stop

   
配置项的详细说明请见官方文档:

 
此时用Consumer去消费消息,会发现消息的编号不连续了,确实漏发了一条消息。这是因为我们在构造Producer时设定了retries=0,所以在发送失败时Producer端不会尝试重发。

 

  同样,我们介绍一下Consumer常用配置

  3) 写一个简单的Producer端,每隔1秒向Kafka集群发送一条消息:

 

 

bin/kafka-server-start.sh config/server.properties & 

    跑一下,输出是这样的:

   
接下来,我们在另一台主机也完成Kafka的安装和配置,然后在两台主机上分别启动Kafka:

 

 
如上,我们也通过测试证实了Kafka集群出现单点故障时,Consumer端的功能正确性。

 

/kafka-topics.sh --describe --zookeeper 10.0.0.100:2181,10.0.0.101:2181,10.0.0.102:2181 --topic test

 

 
我们看到,broker0启动起来了,并且已经是in-sync状态(注意Isr从1变成了1,0),但此时两个partition的leader还都是
broker1,也就是说当前broker1会承载所有的发送和拉取请求。这显然是不行的,我们要让集群恢复到负载均衡的状态。

   
Zookeeper和Kafka的运行都需要Java环境,所以先安装JRE,Kafka默认使用G1垃圾回收器,如果不更改垃圾回收器,官方推荐使用
7u51以上版本的JRE。如果你使用老版本的JRE,需要更改Kafka的启动脚本,指定G1以外的垃圾回收器。

 

2. Zookeeper集群搭建

public class KafkaTest {
    public static void main(String[] args) throws Exception{
        Producer<String, String> producer = KafkaUtil.getProducer();
        int i = 0;
        while(true) {
            ProducerRecord<String, String> record = new ProducerRecord<String, String>("test", String.valueOf(i), "this is message"+i);
            producer.send(record, new Callback() {
                public void onCompletion(RecordMetadata metadata, Exception e) {
                    if (e != null)
                        e.printStackTrace();
                    System.out.println("message send to partition " + metadata.partition() + ", offset: " + metadata.offset());
                }
            });
            i++;
            Thread.sleep(1000);
        }
    }
}

    再次启动server0的zookeeper服务,运行zkServer.sh
status检查,发现新启动的server0也为follower

    验证zookeeper集群高可用性:

cp zoo_sample.cfg zoo.cfg

org.apache.kafka.common.errors.NotLeaderForPartitionException: This
server is not the leader for that topic-partition.

tar -xzvf kafka_2.11-0.9.0.1.tgz

  可以看到,集群重新回到了broker0挂掉之前的状态

 
将retries改为3后再次尝试,会发现leader切换时再次发生了同样的问题,但Producer的重发机制起了作用,消息重发成功,启动Consumer端检查也证实了所有消息都发送成功了。

发表评论

电子邮件地址不会被公开。 必填项已用*标注