RabbitMQ集群、镜像部署配置

1   RABBITMQ简介及安装

 

RabbitMQ是一个开源的AMQP实现,服务器端用Erlang语言编写,支持多种客户端,如:Python、Ruby、.NET、Java、JMS、C、PHP、ActionScript、XMPP、STOMP等,支持AJAX。用于在分布式系统中存储转发消息,在易用性、扩展性、高可用性等方面表现不俗。

AMQP,即Advanced message Queuing Protocol,高级消息队列协议,是应用层协议的一个开放标准,为面向消息的中间件设计。消息中间件主要用于组件之间的解耦,消息的发送者无需知道消息使用者的存在,反之亦然。

AMQP的主要特征是面向消息、队列、路由(包括点对点和发布/订阅)、可靠性、安全。

1   RABBITMQ系统架构

1

RabbitMQ Server: 也叫broker server,是一种传输服务,负责维护一条从Producer到consumer的路线,保证数据能够按照指定的方式进行传输。

Producer,数据的发送方。

Consumer,数据的接收方。

Exchanges 接收消息,转发消息到绑定的队列。主要使用3种类型:direct, topic, fanout。

Queue RabbitMQ内部存储消息的对象。相同属性的queue可以重复定义,但只有第一次定义的有效。

Bindings 绑定Exchanges和Queue之间的路由。

Connection: 就是一个TCP的连接。Producer和consumer都是通过TCP连接到RabbitMQ Server的。

Channel:虚拟连接。它建立在上述的TCP连接中。数据流动都是在Channel中进行的。也就是说,一般情况是程序起始建立TCP连接,第二步就是建立这个Channel。

2   RABBITMQ安装和启动

Ubuntu 安装

编辑 /etc/apt/sources.list 文件添加如下行

deb http://www.rabbitmq.com/debian/ testing main

执行更新软件源命令

#apt-get update.

安装rabbitmq

#apt-get install rabbitmq-server

启动rabbitmq

# service rabbitmq-server start

 

Centos 安装

从官网下载erlang和rabbitmq 的rpm包

安装erlang

#rpm –i erlang-17.4-1.el6.x86_64.rpm

安装rabbitmq

#rpm –i rabbitmq-server-3.5.3-1.noarch.rpm

rabbitmq的rpm安装包不能指定安装路径

3   RABBITMQ配置文件

RABBITMQ配置文件位置:

  • Generic UNIX- $RABBITMQ_HOME/etc/rabbitmq/
  • Debian- /etc/rabbitmq/
  • RPM- /etc/rabbitmq/

 

4   RABBITMQ页面(web)管理

启用web插件

#rabbitmq-plugins enable rabbitmq_management #启用

关闭web插件

# rabbitmq-plugins disable rabbitmq_management

可以用默认账号guest,guest登陆http://主机IP:15672,如果要远程登录,需要先创建帐户,可查看下一节。

5   RABBITMQ创建帐户

如果是集群的话,只要在一台主机设置即可,其它会自动同步。

#rabbitmqctl add_user iom 123456  –iom为新建的用户,123456为密码

#rabbitmqctl  set_user_tags iom administrator –将用户设置为管理员角色

#rabbitmqctl set_permissions -p / iom “.*” “.*” “.*”

–在 / 虚拟主机里设置iom用户配置权限,写权限,读权限。.*是正则表达式里用法。rabbitmq的权限是根据不同的虚拟主机(virtual hosts)配置的,同用户在不同的虚拟主机(virtual hosts)里可能不一样。

2   RABBITMQ安全特性

6   publish消息确认机制

如果采用标准的 AMQP 协议,则唯一能够保证消息不会丢失的方式是利用事务机制 — 令 channel 处于 transactional 模式、向其 publish 消息、执行 commit 动作。在这种方式下,事务机制会带来大量的多余开销,并会导致吞吐量下降 250% 。为了补救事务带来的问题,引入了 confirmation 机制(即 Publisher Confirm)。

confirm 机制是在channel上使用 confirm.select方法,处于 transactional 模式的 channel 不能再被设置成 confirm 模式,反之亦然。

在 channel 被设置成 confirm 模式之后,所有被 publish 的后续消息都将被 confirm(即 ack) 或者被 nack 一次。但是没有对消息被 confirm 的快慢做任何保证,并且同一条消息不会既被 confirm 又被 nack 。

RabbitMQ 将在下面的情况中对消息进行 confirm :

RabbitMQ发现当前消息无法被路由到指定的 queues 中;

非持久属性的消息到达了其所应该到达的所有 queue 中(和镜像 queue 中);

持久消息到达了其所应该到达的所有 queue 中(和镜像 queue 中),并被持久化到了磁盘(被 fsync);

持久消息从其所在的所有 queue 中被 consume 了(如果必要则会被 acknowledge)。

 

7   consumer消息确认机制

为了保证数据不被丢失,RabbitMQ支持消息确认机制,即acknowledgments。

如果没启动消息确认机制,RabbitMQ在consumer收到消息后就会把消息删除。

启用消息确认后,consumer在处理数据后应通过回调函数显示发送ack, RabbitMQ收到ack后才会删掉数据。如果consumer一段时间内不回馈,RabbitMQ会将该消息重新分配给另外一个绑定在该队列上的consumer。另一种情况是consumer断开连接,但是获取到的消息没有回馈,则RabbitMQ同样重新分配。

注意:如果consumer 没调用basic.qos 方法设置prefetch_count=1,那即使该consumer有未ack的messages,RabbitMQ仍会继续发messages给它。

8   消息持久化

消息确认机制确保了consumer退出时消息不会丢失,但如果是RabbitMQ本身因故障退出,消息还是会丢失。为了保证在RabbitMQ出现意外情况时数据仍没有丢失,需要将queue和message都要持久化。

queue持久化:channel.queue_declare(queue=’hello’, durable=True)

message持久化:channel.basic_publish(exchange=”,

routing_key=”task_queue”,

body=message,

properties=pika.BasicProperties(

delivery_mode = 2,)  #消息持久化

)

即使有消息持久化,数据也有可能丢失,因为rabbitmq是先将数据缓存起来,到一定条件才保存到硬盘上,这期间rabbitmq出现意外数据有可能丢失。

网上有测试表明:持久化会对RabbitMQ的性能造成比较大的影响,可能会下降10倍不止。

3   RABBITMQ集群

1   RABBITMQ集群基本概念

一个RABBITMQ集 群中可以共享user,virtualhosts,queues(开启Highly Available Queues),exchanges等。但message只会在创建的节点上传输。当message进入A节点的queue中后,consumer从B节点拉取时,RabbitMQ会临时在A、B间进行消息传输,把A中的消息实体取出并经过B发送给consumer。所以consumer应尽量连接每一个节点,从中取消息。

RABBITMQ的集群节点包括内存节点、磁盘节点。内存节点的元数据仅放在内存中,性能比磁盘节点会有所提升。不过,如果在投递message时,打开了message的持久化,那么内存节点的性能只能体现在资源管理上,比如增加或删除队列(queue),虚拟主机(vrtual hosts),交换机(exchange)等,发送和接受message速度同磁盘节点一样。一个集群至少要有一个磁盘节点。

2   RABBITMQ搭建集群

环境:有三台主机,主机名和IP如下,rabbitmq的执行用户为rabbitmq,所属组为rabbitmq。

主机名         IP

rabbitmq1 192.168.10.2

rabbitmq2 192.168.10.3

rabbitmq3  192.168.10.4

同步erlang.cookie

杀掉rabbitmq2和rabbitmq3的rabbitmq进程:

#ps –ef|grep rab|awk ‘{print $2}’|xargs kill -9。–用service rabbitmq-servier stop停会有遗留进程。

登陆rabbitmq1(rabbitmq1上的rabbitmq服务不能关),执行

#cd /var/lib/rabbitmq     –进入erlang.cookie所在目录,只有ls –al能看见此文件

#chmod 777 .erlang*       –该文件默认为400权限,为方便传输,先修改权限,非必须操作

#scp .erlang.cookie  rabbitmq@192.168.10.3:/var/lib/rabbitmq –将此文件传给另外两条主机

#scp .erlang.cookie  rabbitmq@192.168.10.4:/var/lib/rabbitmq

#chmod 400 .er*          –恢复文件权限

分别在rabbitmq2和rabbitmq3 上执行

#chown rabbitmq:rabbitmq .er*  –修改文件所属用户和所属组

#chmod 400 .er*  –修改文件权限

#service rabbitmq-server start

加入集群

查询rabbitmq1节点名称

#rabbitmqctl cluster_status

Cluster status of node rabbit@rabbitmq1 …

[{nodes,[{disc,[rabbit@rabbitmq1]}]},{running_nodes,[rabbit@ rabbitmq1]}]

…done.

rabbitmq2 加入rabbitmq1 节点.

# rabbitmqctl stop_app   –关掉rabbitmq2服务

# rabbitmqctl join_cluster rabbit@rabbitmq1 — rabbitmq2加入rabbitmq1, rabbitmq2必须能通过rabbitmq1的主机名ping通rabbitmq1。

# rabbitmqctl start_app  –启动rabbitmq2服务

查看集群信息

# rabbitmqctl cluster_status –此时里面就应该能看见两个节点。集群名字为rabbit@rabbitmq。

用相同的方法把rabbitmq3也加入rabbitmq1。

更改节点属性

#rabbitmqctl stop_app  –停止rabbitmq服务

#rabbitmqctl change_cluster_node_type disc/ram –更改节点为磁盘或内存节点

#rabbitmqctl start_app –开启rabbitmq服务

 

查看集群状态

#rabbitmqctl cluster_status

[{nodes,[{disc,[rabbit@rabbitmq1,rabbit@rabbitmq2,rabbit@rabbitmq3]}]}, {running_nodes,[rabbit@rabbitmq1,rabbit@rabbitmq2, rabbit@rabbitmq3]}]…done.

 

–第一行是集群中的节点成员,disc表示这些都是磁盘节点。

–第二行是正在运行的节点成员

3   RABBITMQ退出集群

假设要把rabbitmq2退出集群

在rabbitmq2上执行

#rabbitmqctl stop_app

#rabbitmqctl reset

#rabbitmqctl start_app

 

在集群主节点上执行

# rabbitmqctl forget_cluster_node rabbit@rabbitmq2

4   RABBITMQ集群重启

集群重启时,最后一个挂掉的节点应该第一个重启,如果因特殊原因(比如同时断电),而不知道哪个节点最后一个挂掉。可用以下方法重启:

先在一个节点上执行

#rabbitmqctl force_boot

#service rabbitmq-server start

在其他节点上执行

#service rabbitmq-server start

查看cluster状态是否正常(要在所有节点上查询)。

#rabbitmqctl cluster_status

 

如果有节点没加入集群,可以先退出集群,然后再重新加入集群。

上述方法不适合内存节点重启,内存节点重启的时候是会去磁盘节点同步数据,如果磁盘节点没起来,内存节点一直失败。

5   注意事项

  • cookie在所有节点上必须完全一样,同步时一定要注意。
  • erlang是通过主机名来连接服务,必须保证各个主机名之间可以ping通。可以通过编辑/etc/hosts来手工添加主机名和IP对应关系。如果主机名ping不通,rabbitmq服务启动会失败。
  • 如果queue是非持久化queue,则如果创建queue的那个节点失败,发送方和接收方可以创建同样的queue继续运作。但如果是持久化queue,则只能等创建queue的那个节点恢复后才能继续服务。
  • 在集群元数据有变动的时候需要有disk node在线,但是在节点加入或退出的时候所有的disk node必须全部在线。如果没有正确退出disk node,集群会认为这个节点当掉了,在这个节点恢复之前不要加入其它节点。.

 

4   RABBITMQ HA

1   镜像队列概念

镜像队列可以同步queue和message,当主queue挂掉,从queue中会有一个变为主queue来接替工作。

镜像队列是基于普通的集群模式的,所以你还是得先配置普通集群,然后才能设置镜像队列。

镜像队列设置后,会分一个主节点和多个从节点,如果主节点宕机,从节点会有一个选为主节点,原先的主节点起来后会变为从节点。

queue和message虽然会存在所有镜像队列中,但客户端读取时不论物理面连接的主节点还是从节点,都是从主节点读取数据,然后主节点再将queue和message的状态同步给从节点,因此多个客户端连接不同的镜像队列不会产生同一message被多次接受的情况。

2   配置镜像队列

沿用3.2的环境,现在我们把名为“hello”的队列设置为同步给所有节点

#rabbitmqctl set_policy  ha-all “hello” ‘{“ha-mode”:”all”}’

ha-all 是同步模式,指同步给所有节点,还有另外两种模式ha-exactly表示在指定个数的节点上进行镜像,节点的个数由ha-params指定,ha-nodes表示在指定的节点上进行镜像,节点名称通过ha-params指定;

hello 是同步的队列名,可以用正则表达式匹配;

{“ha-mode”:”all”} 表示同步给所有,同步模式的不同,此参数也不同。

执行上面命令后,可以在web管理界面查看queue 页面,里面hello队列的node节点后会出现+2标签,表示有2个从节点,而主节点则是当前显示的node(xf7021是测试用的名字,按4-2应该为rabbitmq(1-3))。

2

5   keepalived和执行脚本

1   A-keepalived配置

红字为手工加的备注,原文件里没有。

vi /etc/keepalived/keepalived.cnf文件

 

global_defs {

router_id LVS_MASTER   }

 

vrrp_instance VI_1 {

state MASTER

interface eth0

virtual_router_id 51

priority 100

advert_int 1

authentication {

auth_type PASS

auth_pass 1111

}

virtual_ipaddress {

192.168.10.251/24      #rabbitmq

}

}

 

virtual_server 192.168.10.251 5672 {

delay_loop 6

lb_algo rr

lb_kind DR

protocol TCP

 

real_server 192.168.10.3 5672 {

weight 3

TCP_CHECK {

connect_timeout 3

nb_get_retry 3

delay_before_retry 3

connect_port 5672

}

}

 

real_server 192.168.10.4 5672 {

weight 3

TCP_CHECK {

connect_timeout 3

nb_get_retry 3

delay_before_retry 3

connect_port 5672

}

}

}

 

2   rabbitmq 服务器上执行的脚本

lvs_rabbitmq.sh脚本内容:

#!/bin/bash

VIP=192.168.10.251

case “$1” in

start)

ifconfig lo:0 $VIP netmask 255.255.255.255 broadcast $VIP

/sbin/route add -host $VIP dev lo:0

echo “1” >/proc/sys/net/ipv4/conf/lo/arp_ignore

echo “2” >/proc/sys/net/ipv4/conf/lo/arp_announce

echo “1” >/proc/sys/net/ipv4/conf/all/arp_ignore

echo “2” >/proc/sys/net/ipv4/conf/all/arp_announce

sysctl -p >/dev/null 2>&1

echo “lvs_vip server start ok!”;;

stop)

ifconfig lo:0 down

/sbin/route del $VIP >/dev/null 2>&1

 

echo “0” >/proc/sys/net/ipv4/conf/lo/arp_ignore

echo “0” >/proc/sys/net/ipv4/conf/lo/arp_announce

echo “0” >/proc/sys/net/ipv4/conf/all/arp_ignore

echo “0” >/proc/sys/net/ipv4/conf/all/arp_announce

 

echo “lvs_vip server stoped.”;;

 

*)

echo “arg start|stop.”

exit 1

esac

 

exit 0

 

 

6   RABBITMQ监控

RabbitMQ监控项目很多,可通过web管理界面监控。

3

OVERVIEW页面下有4个标签。主要关注totals和nodes两个。

1   totals

4

ready为待处理消息量,total为总消息量。

publish为每秒发送消息量,deliver为每秒接受消息量。

下面5个灰色长方块分别代表对应的模块连接数。

 

2   nodes

5

name为节点名称,后面5个蓝色方块分别代表文件打开数,socket连接数,erlang processes(暂时未知),内存占用两,磁盘空余量;info里显示节点属性,将鼠标放在内容上会显示对应的统计内容。

7   系统测试

3   测试环境

主机名         IP

VIP:      192.168.10.251

client     192.168.10.2    –本测试发送(producer)和接收(consumer)在同一台机器

rabbitmq1 192.168.10.3

rabbitmq2  192.168.10.4

 

4   准备工作

负载机启动keepalived

# service keepalived start

 

 

rabbitmq1和rabbitmq2执行5-2的脚本

#./lvs_rabbitmq.sh start

 

按第3和第4章的方法组建集群,配置镜像队列,节点类型最好都设置为磁盘节点。

按第1-5创建用户。

 

5   客户机测试脚本

测试用RabbitMQ的python语言客户端,注意python是靠缩进量来区分语句块。红色部分为注释,源码上没有。

 

发送源码:

#vi send.py

 

#!/usr/bin/env python

import pika

import time

credentials=pika.PlainCredentials(‘iom’,’123456′)    –配置连接的用户名和密码

parameters=pika.ConnectionParameters(‘192.168.10.251′,5672,’/’,credentials)

connection=pika.BlockingConnection(parameters)

channel=connection.channel()

channel.queue_declare(queue=’hello’)

 

 

count=0

while count<9999:

message=’Hello World’+str(count)

count=count+1

channel.basic_publish(exchange=”,routing_key=’hello’,body=message)

print “Sent %s” %(message)

time.sleep(1)

connection.close()

 

接收源码

#vi receive.py

#!/usr/bin/env python

import pika

connection=pika.BlockingConnection(pika.ConnectionParameters(host=’xf7027′))

channel=connection.channel()

channel.queue_declare(queue=’hello’)

print ‘[*] Waiting for message.To exit press CTRL+C’

def callback(ch,method,properties,body):

print “[x] Received %r” %(body,)

 

channel.basic_consume(callback,queue=’hello’,no_ack=True)

channel.start_consuming()

6   测试过程

测试keepalived分配

在客户机上执行

#python send.py

 

在负载机上执行

#watch ipvsadm –Ln

可以看到rabbitmq1或rabbitmq2的activeconn列数值为1。

 

客户机重新执行发送程序

#python send.py

在负载机上可以看到另一个rabbitmq服务的activeconn 列数值也变为1。

 

 

 

测试容灾性:

 

在客户机上分别执行发送和接受程序。

#python send.py

#python receive.py

然后关掉一个rabbitmq节点,如果关掉的正好是客户机连的那个节点的话,客户机发送和接收程序会报错退出(程序本身如果有错误重发机制则不受任何影响)。如果关掉的是另外的节点,程序不受任何影响。

学习时的痛苦是暂时的 未学到的痛苦是终生的
加入集群 同步.erlang.cookie这个文件的内容

转载于:https://www.cnblogs.com/zhengchunyuan/p/10179927.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/366151.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C语言、c++实现超好玩植物大战僵尸(完整版附源码)

实现这个游戏需要Easy_X main.cpp //开发日志 //1导入素材 //2实现最开始的游戏场景 //3实现游戏顶部的工具栏 //4实现工具栏里面的游戏卡牌 #define WIN_WIDTH 900 #define WIN_HEIGHT 600 //定义植物类型 enum { WAN_DOU, XIANG_RI_KUI, ZHI_WU_COUNT }; #include<stdio.…

【代码笔记】Web-HTML-颜色

一&#xff0c;效果图。 二&#xff0c;代码。 <!DOCTYPE html> <html> <head> <meta charset"utf-8"> <title>html 颜色</title> </head> <body> <!--html 颜色--> <p style"">> 通过十六…

java 如何去掉http debug日志_你居然还去服务器上捞日志,搭个日志收集系统难道不香吗?...

作者&#xff1a;MacroZheng链接&#xff1a;https://juejin.im/post/5eef217d51882565d74fb4eb来源&#xff1a;掘金SpringBoot实战电商项目mall&#xff08;35kstar&#xff09;地址&#xff1a;http://github.com/macrozheng/…摘要ELK日志收集系统进阶使用&#xff0c;本文…

GitHub的10,000个最受欢迎的Java项目-以下是它们使用的顶级库

随着Java开发人员正在使用既成熟又高度发展的语言来工作&#xff0c;无论何时编写新代码&#xff0c;我们都将面临一个持续的难题–使用大家都在谈论的热门新技术&#xff0c;或者坚持使用久经考验的库&#xff1f; 由于Java应用程序的很大一部分是商业性质的&#xff0c;因此…

Java防止Xss注入json_每日一题(java篇) 如何防止xss注入

1、XssAndSqlHttpServletRequestWrapper 类&#xff1a;import java.util.regex.Pattern; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequestWrapper; public class XssAndSqlHttpServletRequestWrapper extends HttpServletReques…

【工具相关】web-HTML/CSS/JS Prettify的使用

一&#xff0c;打开Sublime Text,代码如下面所示。 二&#xff0c;鼠标右键--->HTML/CSS/JS Prettify--->Prettify Code.代码如图所示&#xff0c;明显的代码变得整齐了。 更多专业前端知识&#xff0c;请上 【猿2048】www.mk2048.com

MS SQL 分页存储过程

最近换了家新公司&#xff0c;但是新公司没有使用分页的存储过程。那我就自个写一个往项目上套 &#xff08;效率怎么样就不怎么清楚没有详细的测试过&#xff09; CREATE PROCEDURE [dbo].[pro_common_pageList](tab NVARCHAR(MAX) ,---表名PrimaryKey VARCHAR(100) , --主键I…

STM32CubeMX HAL库串口+DMA数据发送不定长度数据接收

参考资料&#xff1a;1、ST HAL库官网资料 2、https://blog.csdn.net/u014470361/article/details/79206352#comments 一、STM32CubeMX配置外部时钟 注意在进行外部时钟配置时&#xff0c;即“High Speed Clock”和“Low Speed Clock”需配置成“Crytal/Ceramic Resonator&…

pyqt5 qlabel无法显示图片_实战PyQt5: 011-单选框控件QRadioButton

单选框QRadioButton简介QRadioButton为单选按钮&#xff0c; 可以选中(打开)或者取消选中(关闭)。在一组单选按钮中&#xff0c;一次只能选中其中的一个按钮。选中或者取消选中QRadioButton&#xff0c; 都会发出toggled()信号。使用isChecked()可以查看是否选择了某个QRadioBu…

matlab数据游标不能使用,启用数据游标模式

文本解释器&#xff0c;指定为下列值之一&#xff1a;tex - 使用 TeX 标记子集解释字符。latex - 使用 LaTeX 标记解释字符。none - 显示字面字符。TeX 标记默认情况下&#xff0c;MATLAB 支持一部分 TeX 标记。使用 TeX 标记可添加下标和上标&#xff0c;修改字体类型和颜色&a…

MySQL 快速定位性能问题

一、性能查看几款小工具&#xff1a;Top 查看&#xff1a;观察 load average &#xff1a;1分钟&#xff0c;5分钟&#xff0c;15分钟的平均负载值1. us% 用户使用的 CPU 占比&#xff0c;如果 us% 太高&#xff0c; 极有可能索引使用不当。2. sy% 系统内核使用的CPU占比&#…

mybatis-plus分页查询_SpringBoot + MyBatisPlus 快速入门

Hello,大家好&#xff01;前面与大家分享了一次如何搭建Java项目脚手架&#xff0c;并且送给大家一个基础项目模板。那今天与大家分享如何使用这个基础项目&#xff0c;也就是快速上手 SpringBoots ➕ MyBatisPlus。 项目 / 目录结构 天津商业大学学院信息 这是一张天津商业大学…

php 获取每年的节假日,shell获取每年农历节日的日期

原创内容&#xff0c;转载请注明出处&#xff1a;https://www.myzhenai.com.cn/post/3711.html我打算自己写一个每年节日就自动在网站上展示灯笼的源码功能&#xff0c;但是这里最重要的是要获得每年春节、端午节、中秋节等节日的日期&#xff0c;因为要自己写这判断这些日期的…

python爬虫requests实战_Python爬虫之requests库网络爬取简单实战

实例1&#xff1a;直接爬取网页 实例2 &#xff1a; 构造headers&#xff0c;突破访问限制&#xff0c;模拟浏览器爬取网页 实例3 &#xff1a; 分析请求参数&#xff0c;构造请求参数爬取所需网页 实例4&#xff1a; 爬取图片 实例5&#xff1a; 分析请求参数&#xff0c;构造…

某制冷设备制造厂商

某制冷设备制造厂商 该公司是一家以钣金加工&#xff0c;制冷设备制造、销售为主的公司&#xff0c;其产品广泛应用于高级宾馆、饭店及大型餐饮设施等。销售网点遍及日本、北美、欧洲及东南亚&#xff0c;产品深受世界各地用户的欢迎。 该公司原先使用的是TPICS生产管理系统&am…

python数字转换_Python实现中文数字转换为阿拉伯数字的方法示例

本文实例讲述了Python实现中文数字转换为阿拉伯数字的方法。分享给大家供大家参考&#xff0c;具体如下&#xff1a; 一、需求 今天写了三千二百行代码。 今天写了3200行代码。 两行意思相同&#xff0c;只是表达方式不太能够&#xff0c;统一掉。 二、原理 数字的特征是 数字 …

LeetCode第14题:最长公共前缀

题目描述 编写一个函数来查找字符串数组中的最长公共前缀。 如果不存在公共前缀&#xff0c;返回空字符串 ""。 示例 1: 输入: ["flower","flow","flight"] 输出: "fl" 示例 2: 输入: ["dog","racecar"…

臭名昭著的sun.misc.Unsafe解释

Java虚拟机的最大竞争对手可能是托管C&#xff03;等语言的Microsoft CLR 。 CLR允许编写不安全的代码作为低级编程的入口&#xff0c;这在JVM上很难实现。 如果您需要Java中的此类高级功能&#xff0c;则可能会被迫使用JNI &#xff0c;这需要您了解一些C并Swift导致代码紧密耦…

主从复制

五 主从复制 Replication(重要&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;) 5.1、介绍 基于主库二进制日志实时恢复到备库。 5.2、原理 5.2.1 主从复制的前提 &#xff08;1&#xff09;两台或两台以上数据库实例 &#xff08;2&#xff09;主库…

python输出格式控制_Python3.x那些事儿:[50]多种多样的输出格式

目前有两种方式来格式化输出格式&#xff0c;第一种就是自己动手来进行字符串的操作&#xff0c;虽然麻烦&#xff0c;但是都能实现。第二种方式就是使用str.format()函数。 string模块包含了一个Template类&#xff0c;这个类提供了把值替换成字符串的方法。 python提供把任意…