• 关于

    过程表示未响应

    的搜索结果

回答

load-on-startup只是web.xml中一个配置,其意义表示是否在web应用启动后立即加载该servlet。 1.load-on-startup >=0 时,表示在web应用启动后立即加载,其中load-on-startup的值越小,表示加载的优先级越高,如果两个servlet的load-on-startup值相同,则其加载优先级有容器决定;2.load-on-startup 未配置时,则该servlet的加载由容器决定;需要特别说明一下,如你所说,配置load-on-startup后,servlet在startup后立即加载,但只是调用servlet的init()方法,用以初始化该servlet相关的资源。初始化成功后,该servlet可响应web请求;如未配置load-on-startup,容器一般在第一次响应web请求时,会先检测该servlet是否初始化,如未初始化,则调用servlet的init()先初始化,初始化成功后,再响应请求。一般我们在开发web应用时,都会配置这个参数,有两个好处:1、如果初始化过程失败,则容器会提示启动失败,此时我们能够提前知道相关错误;2、配置该参数相当于将初始化servlet的工作转移到容器启动过程,使得容器只要启动成功后,就可立即响应web请求。

蛮大人123 2019-12-02 01:57:44 0 浏览量 回答数 0

问题

DDos分析三:攻击实例 - SYN Flood攻击[续]

千鸟 2019-12-01 21:46:28 14353 浏览量 回答数 3

问题

Nginx性能为什么如此吊

小柒2012 2019-12-01 21:20:47 15038 浏览量 回答数 3

问题

支付宝的性能测试

云效平台 2019-12-01 21:47:13 5472 浏览量 回答数 1

问题

【精品问答】性能测试 PTS

montos 2020-04-08 13:18:48 2 浏览量 回答数 1

问题

阿里云的远程经常断开,无法解决

boerthaaa 2019-12-01 21:59:01 10536 浏览量 回答数 4

问题

erp系统中国制造企业理性的追求

lovequeen0 2019-12-01 20:17:35 7430 浏览量 回答数 0

回答

对于每一个请求,函数计算服务会根据请求头部的 Authorization 字段来校验是否合法(设置了 HTTP 触发器的允许匿名访问的函数除外)。客户端须使用与函数计算服务端一致的签名算法才能通过验证,对于未包含签名字段或者签名错误的请求,函数计算服务将会返回 HTTP 403 错误。 本文对函数计算的签名校验算法进行介绍。 签名算法 signature = base64(hmac-sha256(HTTP_METHOD + "\n" + CONTENT-MD5 + "\n" + CONTENT-TYPE + "\n" + DATE + "\n" + CanonicalizedFCHeaders + CanonicalizedResource)) // Authorization字段介绍 Authorization = "FC " + accessKeyID + ":" + signature HTTP_METHOD 表示大写的 HTTP Method (如:PUT, GET, POST, DELETE) CONTENT-MD5 表示请求内容数据的 MD5 值。如果请求的 Header 中没有传 Content-MD5,则此处填入空串 CONTENT-TYPE 表示请求内容的类型 DATE 表示此次操作的时间,不能为空,目前只支持 GMT 格式 注意:客户端需要保证生成的时间与函数计算服务端的时间相差不超过15分钟,否则函数服务将拒绝此请求 CanonicalizedFCHeaders 表示所有以 x-fc- 为前缀的 HTTP 头组成的字符串,生成方式见下文 CanonicalizedResource 表示请求的 URL 的 Path ,一般来说是先对收到的 Path decode,再去掉请求的 Path 里的 Params 内容。 Path 的结构为:$api-version/api-path api-version:API 版本,当前版本为 2016-08-15。 api-path:访问各个接口的路径,例如创建 service 为 /services,其他 path 请参考 API 定义。 需要认证的 HTTP 触发器的CanonicalizedResource 与其他请求的CanonicalizedResource 不同,下面对两种情况分别进行介绍。 普通请求的 CanonicalizedResource (普通请求为除了需要访问带认证的 HTTP 触发器的请求外的所有请求): 首先对收到的 Path 进行 url 解码,普通请求的 CanonicalizedResource 会只取到?前面的内容,即舍弃传入的各个Params 需要认证的 HTTP 触发器的CanonicalizedResource :如果有 Params ,则以回车符 \n 分隔各个参数,Params 中的各个参数 key - value 对按照字母序进行排序(如果 Params 里的 key 对应多个 value ,即对 key - value 整体进行排序)。如果没有 Params,最后也以 \n 结束。例如 // 需要认证的 HTTP 触发器的 url 的真实 path /2016-08-15/proxy/service-name/func-name/path-with-%20-space/action?x=1&a=2&x=3&with%20space=foo%20bar // url decode 后的结果 /2016-08-15/proxy/service-name/func-name/path-with- -space/action?x=1&a=2&x=3&with space=foo bar // 需要认证的 HTTP 触发器的 CanonicalizedResource /2016-08-15/proxy/service-name/func-name/path-with- -space/action\na=2\nwith space=foo bar\nx=1\nx=3 // 普通请求的 url 的真实 path /2016-08-15/service-name/func-name/path-with-%20-space/action?x=1&a=2&x=3&with%20space=foo%20bar // url decode 后的结果 /2016-08-15/service-name/func-name/path-with- -space/action?x=1&a=2&x=3&with space=foo bar // 普通请求的 CanonicalizedResource /2016-08-15/service-name/func-name/path-with- -space/action hmac-sha256需要以用户的 AccessKeySecret 为 Key 伪代码如下: // 构造字符串的过程 function composeStringToSign(method, path, headers, queries) { var contentMD5 = headers['content-md5'] || ''; var contentType = headers['content-type'] || ''; var date = headers['date']; var signHeaders = buildCanonicalHeaders(headers, 'x-fc-'); var u = url.parse(path); var pathUnescaped = decodeURIComponent(u.pathname); var str = ${method}\n${contentMD5}\n${contentType}\n${date}\n${signHeaders}${pathUnescaped}; if (queries) { var params = []; Object.keys(queries).forEach(function (key) { var values = queries[key]; var type = typeof values; if (type === 'string') { params.push(${key}=${values}); return; } if (type === 'object' && values instanceof Array) { queries[key].forEach(function (value) { params.push(${key}=${value}); }); } }); params.sort(); str += '\n' + params.join('\n'); } return str; } // 使用 hmac-sha256 和 base64 计算签名的过程,其中 source 参数为构造出的字符串 function signString(source, secret) { const buff = crypto.createHmac('sha256', secret) .update(source, 'utf8') .digest(); return new Buffer(buff, 'binary').toString('base64'); } CanonicalizedFCHeaders 生成步骤如下: 找出请求头中所有以 x-fc- 开头的字段(不区分大小写) 对于符合前缀的字段,先将字段名转换成小写 对于每一个字段,生成一个子串 ${key}:${value}\n , ${key} 是 HTTP 头的名称(转换成小写) ${value} 是 HTTP 头的值 例如:X-Fc-Invocation-Type:Sync 变成 x-fc-invocation-type:Sync\n 然后将这些字段按字段名从小到大排序 将上述生成的子串连接成一个整串 伪代码如下: // javascript // prefix = 'x-fc-' function buildCanonicalHeaders(headers, prefix) { var list = []; var keys = Object.keys(headers); var fcHeaders = {}; for (var i = 0; i < keys.length; i++) { var key = keys[i]; var lowerKey = key.toLowerCase().trim(); if (lowerKey.startsWith(prefix)) { list.push(lowerKey); fcHeaders[lowerKey] = headers[key]; } } list.sort(); var canonical = ''; for (var _i = 0; _i < list.length; _i++) { var _key = list[_i]; canonical += ${_key}:${fcHeaders[_key]}\n; } return canonical; } Authorization 字段 Authorization 可由上文计算得出的 signature 构造出来,构造方法如下: Authorization = "FC " + accessKeyID + ":" + signature 请求示例 请求: GET /2016-08-15/services?limit=100&nextToken=&prefix=&startKey= HTTP/1.1 Host: 1237050315505682.fc.cn-shanghai.aliyuncs.com User-Agent: go-sdk-0.1 Accept: application/json Authorization: FC LTAIUyt0Yeq1rgqo:GBmoz6OwC7bobTlD1jboBZ9PkaZ1e4cKsQ+5/dlLTns= Date: Mon, 08 May 2017 03:08:31 GMT X-User-Agent: go-resty v0.11 - https://github.com/go-resty/resty Accept-Encoding: gzip 响应: HTTP/1.1 200 OK Content-Type: application/json; charset=utf-8 X-Fc-Request-Id: ab7c7602-0922-f04f-b4ee-923cd7df7fb0 Date: Mon, 08 May 2017 03:08:31 GMT Transfer-Encoding: chunked 代码示例 可以参考我们已经发布的SDK中签名部分的代码: fc-nodejs-sdk

1934890530796658 2020-03-27 17:55:35 0 浏览量 回答数 0

回答

详细解答可以参考官方帮助文档 阿里云任何版本的企业邮箱服务禁止发送营销邮件,营销邮件标准及相关规范,参见中国互联网协会反垃圾信息中心的管理规范。中国互联网协会电子邮件营销规范(V1.2)来源:反垃圾信息中心一、总则1.1 为规范电子邮件形式的市场营销行为,统一电子邮件营销[注1]的基本要求,为接收和发送营销内容的电子邮件提供依据,保护电子邮件用户的合法权益,根据我国相关法律法规的规定,制定本规范。1.2 本规范适用于电子邮件营销活动的开展和评价。1.3 本规范基于《互联网电子邮件服务管理办法》(中华人民共和国信息产业部令第38号)制定,从事电子邮件营销除应执行本规范外,还应符合《互联网电子邮件服务管理办法》及其他国家现行的有关标准的规定。二、基本规定2.1 中国互联网协会对电子邮件营销服务提供者[注2]实行登记备案管理。电子邮件营销服务提供者应当在开展电子邮件营销活动前将电子邮件发送服务器所使用的IP地址[注11]及相关信息向中国互联网协会反垃圾信息中心登记备案,并遵守以下规定:2.1.1需报备的 IP 地址及相关信息(1)备案单位基本情况,包括备案单位名称、备案单位地址、备案单位性质、备案单位组织机构代码、备案单位营业执照注册号、备案单位经营范围、备案单位注册资金、备案单位网站域名、备案单位法人代表姓名、备案单位联系人姓名、联系人电话、 联系人电子邮件、联系人即时通信方式等。(2)备案单位电子邮件发送服务器IP地址分配使用信息,包括备案单位用于发送电子邮件的IP地址数量、IP地址、IP地址段、IP地址所属单位名称、IP地址对应域名、IP地址对应发送营销电子邮件[注3]性质/类型(事务性邮件和商业性邮件等);(3)备案单位可自愿报备每次电子邮件营销活动的信息,包括本次营销活动使用IP地址、域名、发件人邮箱地址、电子邮件HELO[注19]信息、收件人数量、发送周期、平均发送速率[注10]、单IP最大发送速率、发送营销电子邮件性质/类型(事务性邮件和商业性邮件等)、营销电子邮件的原信/样信等。(4)其他需要备案的信息。2.1.2 电子邮件营销服务提供者拟变更电子邮件营销服务信息的,应当提前办理变更登记手续。2.1.3 电子邮件营销服务提供者提交的备案信息必须完整、真实、有效且符合我国相关法律法规规定。2.1.4 中国互联网协会反垃圾信息中心负责审核电子邮件营销服务提供者提交的备案资料,对符合要求的备案单位发放电子邮件营销备案资质证书。2.2 电子邮件营销服务提供者应当确保所有与电子邮件服务有关的域名和IP地址注册信息正确、完整和及时更新,并遵守以下规定:2.2.1 发送电子邮件的服务器IP地址必须使用静态IP[注12]地址,并已采取IP反向解析[注13]措施。2.2.2 发送电子邮件的邮箱域名建议与发送电子邮件的服务器IP反向解析的域名信息一致,并已采取SPF解析[注14]。2.2.3 建议使用DKIM[注15]、DMARC[注16]等反垃圾邮件技术,提高与电子邮件发送相关的域名和IP的信誉。2.2.4 关注知名的RBL[注17]组织列表,如果发现与电子邮件发送相关的域名、IP或邮箱地址出现在知名的RBL[注17]组织列表上,应及时采取措施进行申诉和解封。2.2.5 建议发送事务性邮件和商业性邮件的服务器分配不同的IP地址和发送邮箱地址。2.2.6 具有特殊功能的账户,如postmaster@账户(邮件管理员账户)或abuse@账户(投诉账户),必须保证其有效,并由专人负责管理维护。2.3 电子邮件营销服务提供者应当建立可靠有效的订阅[注5]及退订[注9]机制,并遵守以下规定:2.3.1未经电子邮件接收者明确许可,不得向其发送营销电子邮件。获取接收者许可的过程和内容应清楚、明确,且不违背我国的相关法律规定。电子邮件营销服务提供者应公布获取接收者许可的策略,保存接收者同意接收营销邮件的许可记录,以便在需要时向接收者提供相关信息。2.3.2营销电子邮件必须提供给接收者至少包含一种退订的途径和具体操作方法,退订信息应醒目、清晰,退订操作方法应简单,有效。2.3.3确保退订请求可以正常发送并能够被及时自动响应处理。不得强制要求用户提交退订原因或设置退订条件,退订请求发出后应在3个工作日内生效。2.4 电子邮件营销服务提供者应规范的使用和维护其营销用户[注4]的电子邮件地址列表[注6],并遵守以下规定:2.4.1 电子邮件营销服务提供者对营销用户的个人信息和电子邮件地址负有保密的义务。未经用户同意,不得泄露用户的个人信息和电子邮件地址,法律、行政法规另有规定的除外。2.4.2 电子邮件营销服务提供者应制定安全合理的隐私策略[注8]。营销用户的个人信息资料和电子邮件地址的使用应与收集目的一致,未经用户同意,不得用于收集目的以外的其它用途。2.4.3 必须保证每个电子邮件地址的取得都经过了用户的许可。尽量确保每个电子邮件地址都是真实有效的。2.4.4 应合理处理邮件投递过程中接收电子邮件的服务器返回的错误代码[注7]。对于返回代码表示不存在的电子邮件地址,应及时从发送列表中删除;对于连续出现投递错误的电子邮件地址,建议及时调整投递策略,减少可能导致错误发生的情况。2.5 电子邮件营销服务提供者应使用规范的电子邮件格式与内容,并遵守以下规定:2.5.1 营销电子邮件的内容不得违反我国相关法律法规规定。2.5.2 营销电子邮件格式应符合国际通用规范标准(参见RFC 2822)。邮件中如果包含HTML格式,应遵循由万维网联盟(W3C)公布的w3.org[注18]设计规范。2.5.3 营销电子邮件应标明邮件发送方的身份和真实的可返回的邮件发送地址。邮件的标题和信体要能准确的反映出邮件的内容、真实来源和通信目的。邮件正文应包含发送方的名称、地址、联系电话和电子邮件地址等详细信息。2.5.4 营销电子邮件的主题与内容必须相匹配。邮件内容应与营销用户的订阅内容一致。2.5.5 应采取有效的措施保护未成年人,尽可能的识别未成年的邮件订阅者。营销电子邮件含有不适合未成年人阅读的内容时,应提前核实接收者的年龄,确保接收者达到合法接收和阅读的年龄。发送给未成年人的营销邮件应征得其监护人的许可,内容符合此年龄段人群的知识水准、阅历和心里成熟程度。2.6 电子邮件营销服务提供者应与邮件接收方建立良好的沟通渠道,并参考以下规定:2.6.1 中国互联网协会反垃圾信息中心负责协助电子邮件营销服务提供者与邮件接收组织之间的沟通协调,在邮件传送过程中出现问题时,及时有效的进行沟通,确保尽快使问题得到解决。2.6.2 中国互联网协会反垃圾信息中心应协助电子邮件营销服务提供者与邮件接收组织之间建立信息反馈机制,改进电子邮件营销服务提供者的服务水平。2.6.3 中国互联网协会反垃圾信息中心应对电子邮件营销活动进行监督,对电子邮件营销服务提供者的信誉进行评价。2.6.4 电子邮件营销服务提供者应建立公平、高效、安全、易于使用的邮件投诉系统,在营销电子邮件中为营销用户提供便捷的投诉方式,受理营销用户对营销电子邮件的投诉。对被投诉的营销电子邮件,应立即开展调查,采取合理有效的防范或处理措施,并将有关情况和调查结果及时向各省通信管理局等国家有关机关或者12321网络不良和垃圾信息举报受理中心报告。2.6.5 电子邮件营销服务提供者应按照邮件接收方的要求限制营销电子邮件的发送速率。邮件接收方应将未投递成功的电子邮件服务器错误信息反馈邮件发送方。对信誉良好,行为规范的电子邮件营销服务提供者,邮件接收方可适当放宽营销电子邮件的发送速率。2.7 电子邮件营销服务提供者应积极配合各省通信管理局等国家有关机关和12321网络不良和垃圾信息举报受理中心开展调查工作。2.8 中国互联网协会拥有本规范的解释权和修改权。2.9 本规范自发布之日起施行。 附注:1. 电子邮件营销:指通过电子邮件开展的营销活动。2. 电子邮件营销服务提供者:也是营销电子邮件的发送方,指提供电子邮件营销服务的单位或个人,包括直接开展电子邮件营销活动的单位或个人以及接受委托开展电子邮件营销活动的单位或个人。3. 营销电子邮件:指具有营销功能的电子邮件。根据电子邮件的发送目的,分为事务性邮件和商业性邮件两种类型。3.1 事务性邮件,是指由收件人触发并已允许发件人发送的,以推动、完成或确认相关联流程为主要目的而发送的电子邮件。常见分类包括:(1)账号相关:账号激活、信息验证、账号绑定、密码修改、密码取回等。(2)交易信息:订单通知、付款通知、退款通知、物流通知、交易投诉等。(3)账单信息:对帐单、流水账单、催款通知、账户变更等。(4)其他类型。3.2 商业性邮件,是指任何以推销或者推广某种商品或服务(包括商业性网站的内容)为主要目的而发送的电子邮件。常见分类包括:(1)期刊资讯:更新通知、各类期刊、各类报表等。(2)产品促销:新品推广、季末促销、优惠套餐、折扣优惠、积分优惠等。(3)成员营销:好友邀请、成员关怀、主题活动、用户调研等。(4)其他类型。3.3 事务性邮件如果附带商业性内容,则视为商业性邮件。4. 营销用户:指电子邮件营销活动的对象,即接收营销电子邮件的电子邮箱使用者。5. 订阅:指营销用户预先订制,同意接收订制的营销电子邮件的行为。6. 邮件列表:指已经订阅了某一类营销电子邮件的用户电子邮箱地址列表,该列表是此类营销电子邮件的发送对象。7. 错误代码/硬退回/软退回:指在邮件的SMTP发送过程中,收信方服务器每处理完一条SMTP命令,都会向发信方服务器回传一个返回信息,用于表明对这条SMTP命令的执行结果。如返回信息以4XX(如450等)开头,指接收方临时性拒收该邮件,称软退回;如返回信息以5XX(如550等)开头,指接收方永久性拒收该邮件,称硬退回。以上列举的两类代码,习惯称为错误代码。8. 隐私策略:指电子邮件营销活动所收集的营销用户信息类型,收集方式和收集技术,以及信息的提供对象和使用用途。隐私策略中还应包括用户信息保护的安全措施、责任和实施过程。9. 退订:指营销用户取消订阅营销电子邮件的行为。10. 发送速率:指单位时间内的发送电子邮件的总数量。 常见的时间间隔单位包括:分钟、15分钟、小时、天、周、月等。11. IP地址/IP段IP地址是被用于定位互联网上的电脑一个唯一编号,地址的格式如159.226.1.1。多个IP地址的组合,即称为IP段。邮件发送过程中会?谰軮P地址,来确定邮件发送者和邮件接收者的位置。12. 静态IP地址指长期固定分配给一台计算机使用的IP地址,一般是由网络运营商分配。13. IP反向解析IP反向解析是一项常用的反垃圾邮件技术。常用的DNS服务器里面有两个区域,即“正向查找区域”和“反向查找区域”。正向查找区域是指域名解析,反向查找区域即是IP反向解析,简称PTR记录,其作用是通过查询IP地址的PTR记录来得到该IP地址指向的域名。PTR记录需要由提供IP地址的网络运营商(ISP)进行配置。14. SPFSPF(Sender Policy Framework)是一种通过IP地址来认证电子邮件发件人身份的技术,是一项非常高效的反垃圾邮件技术。它通过在DNS中发布一条TXT类型的记录,用于登记某个域名所有拥有的合法的发送邮件的所有IP地址。15. DKIMDKIM(DomainKeys Identified Mail)是一种防诈骗邮件的反垃圾邮件技术。DKIM要求邮件发送方在电子邮件的信头插入DKIM-Signature及电子签名信息,而邮件接收方则通过DNS查询得到其公钥然后进行合法性验证。16. DMARCDMARC(Domain-based Message Authentication, Reporting and Conformance)是一种防诈骗邮件的反垃圾邮件技术。DMARC结合SPF和DKIM两项技术,通过检查电子邮件信头的发件人的合法性,将诈骗邮件识别出来。17. RBLRBL(Real-time Blackhole List),即实时黑名单列表,是一些由国际知名的反垃圾邮件组织所提供的恶意发送垃圾邮件的发件人邮箱地址,IP地址,URL地址等黑名单列表的服务。若已被RBL收录,需到相应RBL官方网站上去核实并申请移除。常见的知名RBL组织,如中国互联网协会反垃圾信息中心、spamhaus,Maps,sorbs,uribl,surbl等。18. w3.org规范由万维网联盟(W3C)共同开发与公布的各种web设计规范。当邮件正文以网页的形式组织时,应当参考这些规范。19.HELO电子邮件头中邮件发送者用来标识自己的身份的命令字段。 附录:电子邮件营销常用指标1. 发送量发送的营销电子邮件数量2. 到达量发送的营销电子邮件数量-退回的营销电子邮件数量3. 到达率到达接收方邮箱的营销电子邮件数量/发送的营销电子邮件数量×100%4. 退信率退回的营销电子邮件数量/发送的营销电子邮件数量×100%5. 硬退信率硬退回的营销电子邮件数量/发送的营销电子邮件数量×100%6. 软退信率软退回的营销电子邮件数量/发送的营销电子邮件数量×100%7. 打开率打开营销电子邮件的接收方数量/收到营销电子邮件的接收方数量×100%,不计算重复打开邮件的情况。8. 点击率点击了营销电子邮件内容中链接的接收方数量/收到营销电子邮件的接收方数量×100%,不计算重复点击的情况。9. 点击打开率点击了营销电子邮件内容中链接的接收方数量/打开营销电子邮件的接收方数量×100%,不计算重复点击和重复打开的情况。10. 退订率退订营销电子邮件的接收方数量/收到营销电子邮件的接收方数量×100%11. 投诉率被投诉的营销电子邮件数量/到达接收方邮箱的营销电子邮件数量×100%12. 信誉度邮件接收方或者第三方机构对营销电子邮件服务信誉和质量的评定结果 参考中华人民共和国信息产业部令第38号 互联网电子邮件服务管理办法中国互联网协会 电子邮件服务指南(V1.1)中国互联网协会 中国互联网协会互联网公共电子邮件服务规范YD-T 1310-2004 互联网广告电子邮件格式要求YD-T 1311-2004 防范互联网垃圾电子邮件技术要求

2019-12-01 23:24:48 0 浏览量 回答数 0

回答

详细解答可以参考官方帮助文档 阿里云任何版本的企业邮箱服务禁止发送营销邮件,营销邮件标准及相关规范,参见中国互联网协会反垃圾信息中心的管理规范。中国互联网协会电子邮件营销规范(V1.2)来源:反垃圾信息中心一、总则1.1 为规范电子邮件形式的市场营销行为,统一电子邮件营销[注1]的基本要求,为接收和发送营销内容的电子邮件提供依据,保护电子邮件用户的合法权益,根据我国相关法律法规的规定,制定本规范。1.2 本规范适用于电子邮件营销活动的开展和评价。1.3 本规范基于《互联网电子邮件服务管理办法》(中华人民共和国信息产业部令第38号)制定,从事电子邮件营销除应执行本规范外,还应符合《互联网电子邮件服务管理办法》及其他国家现行的有关标准的规定。二、基本规定2.1 中国互联网协会对电子邮件营销服务提供者[注2]实行登记备案管理。电子邮件营销服务提供者应当在开展电子邮件营销活动前将电子邮件发送服务器所使用的IP地址[注11]及相关信息向中国互联网协会反垃圾信息中心登记备案,并遵守以下规定:2.1.1需报备的 IP 地址及相关信息(1)备案单位基本情况,包括备案单位名称、备案单位地址、备案单位性质、备案单位组织机构代码、备案单位营业执照注册号、备案单位经营范围、备案单位注册资金、备案单位网站域名、备案单位法人代表姓名、备案单位联系人姓名、联系人电话、 联系人电子邮件、联系人即时通信方式等。(2)备案单位电子邮件发送服务器IP地址分配使用信息,包括备案单位用于发送电子邮件的IP地址数量、IP地址、IP地址段、IP地址所属单位名称、IP地址对应域名、IP地址对应发送营销电子邮件[注3]性质/类型(事务性邮件和商业性邮件等);(3)备案单位可自愿报备每次电子邮件营销活动的信息,包括本次营销活动使用IP地址、域名、发件人邮箱地址、电子邮件HELO[注19]信息、收件人数量、发送周期、平均发送速率[注10]、单IP最大发送速率、发送营销电子邮件性质/类型(事务性邮件和商业性邮件等)、营销电子邮件的原信/样信等。(4)其他需要备案的信息。2.1.2 电子邮件营销服务提供者拟变更电子邮件营销服务信息的,应当提前办理变更登记手续。2.1.3 电子邮件营销服务提供者提交的备案信息必须完整、真实、有效且符合我国相关法律法规规定。2.1.4 中国互联网协会反垃圾信息中心负责审核电子邮件营销服务提供者提交的备案资料,对符合要求的备案单位发放电子邮件营销备案资质证书。2.2 电子邮件营销服务提供者应当确保所有与电子邮件服务有关的域名和IP地址注册信息正确、完整和及时更新,并遵守以下规定:2.2.1 发送电子邮件的服务器IP地址必须使用静态IP[注12]地址,并已采取IP反向解析[注13]措施。2.2.2 发送电子邮件的邮箱域名建议与发送电子邮件的服务器IP反向解析的域名信息一致,并已采取SPF解析[注14]。2.2.3 建议使用DKIM[注15]、DMARC[注16]等反垃圾邮件技术,提高与电子邮件发送相关的域名和IP的信誉。2.2.4 关注知名的RBL[注17]组织列表,如果发现与电子邮件发送相关的域名、IP或邮箱地址出现在知名的RBL[注17]组织列表上,应及时采取措施进行申诉和解封。2.2.5 建议发送事务性邮件和商业性邮件的服务器分配不同的IP地址和发送邮箱地址。2.2.6 具有特殊功能的账户,如postmaster@账户(邮件管理员账户)或abuse@账户(投诉账户),必须保证其有效,并由专人负责管理维护。2.3 电子邮件营销服务提供者应当建立可靠有效的订阅[注5]及退订[注9]机制,并遵守以下规定:2.3.1未经电子邮件接收者明确许可,不得向其发送营销电子邮件。获取接收者许可的过程和内容应清楚、明确,且不违背我国的相关法律规定。电子邮件营销服务提供者应公布获取接收者许可的策略,保存接收者同意接收营销邮件的许可记录,以便在需要时向接收者提供相关信息。2.3.2营销电子邮件必须提供给接收者至少包含一种退订的途径和具体操作方法,退订信息应醒目、清晰,退订操作方法应简单,有效。2.3.3确保退订请求可以正常发送并能够被及时自动响应处理。不得强制要求用户提交退订原因或设置退订条件,退订请求发出后应在3个工作日内生效。2.4 电子邮件营销服务提供者应规范的使用和维护其营销用户[注4]的电子邮件地址列表[注6],并遵守以下规定:2.4.1 电子邮件营销服务提供者对营销用户的个人信息和电子邮件地址负有保密的义务。未经用户同意,不得泄露用户的个人信息和电子邮件地址,法律、行政法规另有规定的除外。2.4.2 电子邮件营销服务提供者应制定安全合理的隐私策略[注8]。营销用户的个人信息资料和电子邮件地址的使用应与收集目的一致,未经用户同意,不得用于收集目的以外的其它用途。2.4.3 必须保证每个电子邮件地址的取得都经过了用户的许可。尽量确保每个电子邮件地址都是真实有效的。2.4.4 应合理处理邮件投递过程中接收电子邮件的服务器返回的错误代码[注7]。对于返回代码表示不存在的电子邮件地址,应及时从发送列表中删除;对于连续出现投递错误的电子邮件地址,建议及时调整投递策略,减少可能导致错误发生的情况。2.5 电子邮件营销服务提供者应使用规范的电子邮件格式与内容,并遵守以下规定:2.5.1 营销电子邮件的内容不得违反我国相关法律法规规定。2.5.2 营销电子邮件格式应符合国际通用规范标准(参见RFC 2822)。邮件中如果包含HTML格式,应遵循由万维网联盟(W3C)公布的w3.org[注18]设计规范。2.5.3 营销电子邮件应标明邮件发送方的身份和真实的可返回的邮件发送地址。邮件的标题和信体要能准确的反映出邮件的内容、真实来源和通信目的。邮件正文应包含发送方的名称、地址、联系电话和电子邮件地址等详细信息。2.5.4 营销电子邮件的主题与内容必须相匹配。邮件内容应与营销用户的订阅内容一致。2.5.5 应采取有效的措施保护未成年人,尽可能的识别未成年的邮件订阅者。营销电子邮件含有不适合未成年人阅读的内容时,应提前核实接收者的年龄,确保接收者达到合法接收和阅读的年龄。发送给未成年人的营销邮件应征得其监护人的许可,内容符合此年龄段人群的知识水准、阅历和心里成熟程度。2.6 电子邮件营销服务提供者应与邮件接收方建立良好的沟通渠道,并参考以下规定:2.6.1 中国互联网协会反垃圾信息中心负责协助电子邮件营销服务提供者与邮件接收组织之间的沟通协调,在邮件传送过程中出现问题时,及时有效的进行沟通,确保尽快使问题得到解决。2.6.2 中国互联网协会反垃圾信息中心应协助电子邮件营销服务提供者与邮件接收组织之间建立信息反馈机制,改进电子邮件营销服务提供者的服务水平。2.6.3 中国互联网协会反垃圾信息中心应对电子邮件营销活动进行监督,对电子邮件营销服务提供者的信誉进行评价。2.6.4 电子邮件营销服务提供者应建立公平、高效、安全、易于使用的邮件投诉系统,在营销电子邮件中为营销用户提供便捷的投诉方式,受理营销用户对营销电子邮件的投诉。对被投诉的营销电子邮件,应立即开展调查,采取合理有效的防范或处理措施,并将有关情况和调查结果及时向各省通信管理局等国家有关机关或者12321网络不良和垃圾信息举报受理中心报告。2.6.5 电子邮件营销服务提供者应按照邮件接收方的要求限制营销电子邮件的发送速率。邮件接收方应将未投递成功的电子邮件服务器错误信息反馈邮件发送方。对信誉良好,行为规范的电子邮件营销服务提供者,邮件接收方可适当放宽营销电子邮件的发送速率。2.7 电子邮件营销服务提供者应积极配合各省通信管理局等国家有关机关和12321网络不良和垃圾信息举报受理中心开展调查工作。2.8 中国互联网协会拥有本规范的解释权和修改权。2.9 本规范自发布之日起施行。 附注:1. 电子邮件营销:指通过电子邮件开展的营销活动。2. 电子邮件营销服务提供者:也是营销电子邮件的发送方,指提供电子邮件营销服务的单位或个人,包括直接开展电子邮件营销活动的单位或个人以及接受委托开展电子邮件营销活动的单位或个人。3. 营销电子邮件:指具有营销功能的电子邮件。根据电子邮件的发送目的,分为事务性邮件和商业性邮件两种类型。3.1 事务性邮件,是指由收件人触发并已允许发件人发送的,以推动、完成或确认相关联流程为主要目的而发送的电子邮件。常见分类包括:(1)账号相关:账号激活、信息验证、账号绑定、密码修改、密码取回等。(2)交易信息:订单通知、付款通知、退款通知、物流通知、交易投诉等。(3)账单信息:对帐单、流水账单、催款通知、账户变更等。(4)其他类型。3.2 商业性邮件,是指任何以推销或者推广某种商品或服务(包括商业性网站的内容)为主要目的而发送的电子邮件。常见分类包括:(1)期刊资讯:更新通知、各类期刊、各类报表等。(2)产品促销:新品推广、季末促销、优惠套餐、折扣优惠、积分优惠等。(3)成员营销:好友邀请、成员关怀、主题活动、用户调研等。(4)其他类型。3.3 事务性邮件如果附带商业性内容,则视为商业性邮件。4. 营销用户:指电子邮件营销活动的对象,即接收营销电子邮件的电子邮箱使用者。5. 订阅:指营销用户预先订制,同意接收订制的营销电子邮件的行为。6. 邮件列表:指已经订阅了某一类营销电子邮件的用户电子邮箱地址列表,该列表是此类营销电子邮件的发送对象。7. 错误代码/硬退回/软退回:指在邮件的SMTP发送过程中,收信方服务器每处理完一条SMTP命令,都会向发信方服务器回传一个返回信息,用于表明对这条SMTP命令的执行结果。如返回信息以4XX(如450等)开头,指接收方临时性拒收该邮件,称软退回;如返回信息以5XX(如550等)开头,指接收方永久性拒收该邮件,称硬退回。以上列举的两类代码,习惯称为错误代码。8. 隐私策略:指电子邮件营销活动所收集的营销用户信息类型,收集方式和收集技术,以及信息的提供对象和使用用途。隐私策略中还应包括用户信息保护的安全措施、责任和实施过程。9. 退订:指营销用户取消订阅营销电子邮件的行为。10. 发送速率:指单位时间内的发送电子邮件的总数量。 常见的时间间隔单位包括:分钟、15分钟、小时、天、周、月等。11. IP地址/IP段IP地址是被用于定位互联网上的电脑一个唯一编号,地址的格式如159.226.1.1。多个IP地址的组合,即称为IP段。邮件发送过程中会?谰軮P地址,来确定邮件发送者和邮件接收者的位置。12. 静态IP地址指长期固定分配给一台计算机使用的IP地址,一般是由网络运营商分配。13. IP反向解析IP反向解析是一项常用的反垃圾邮件技术。常用的DNS服务器里面有两个区域,即“正向查找区域”和“反向查找区域”。正向查找区域是指域名解析,反向查找区域即是IP反向解析,简称PTR记录,其作用是通过查询IP地址的PTR记录来得到该IP地址指向的域名。PTR记录需要由提供IP地址的网络运营商(ISP)进行配置。14. SPFSPF(Sender Policy Framework)是一种通过IP地址来认证电子邮件发件人身份的技术,是一项非常高效的反垃圾邮件技术。它通过在DNS中发布一条TXT类型的记录,用于登记某个域名所有拥有的合法的发送邮件的所有IP地址。15. DKIMDKIM(DomainKeys Identified Mail)是一种防诈骗邮件的反垃圾邮件技术。DKIM要求邮件发送方在电子邮件的信头插入DKIM-Signature及电子签名信息,而邮件接收方则通过DNS查询得到其公钥然后进行合法性验证。16. DMARCDMARC(Domain-based Message Authentication, Reporting and Conformance)是一种防诈骗邮件的反垃圾邮件技术。DMARC结合SPF和DKIM两项技术,通过检查电子邮件信头的发件人的合法性,将诈骗邮件识别出来。17. RBLRBL(Real-time Blackhole List),即实时黑名单列表,是一些由国际知名的反垃圾邮件组织所提供的恶意发送垃圾邮件的发件人邮箱地址,IP地址,URL地址等黑名单列表的服务。若已被RBL收录,需到相应RBL官方网站上去核实并申请移除。常见的知名RBL组织,如中国互联网协会反垃圾信息中心、spamhaus,Maps,sorbs,uribl,surbl等。18. w3.org规范由万维网联盟(W3C)共同开发与公布的各种web设计规范。当邮件正文以网页的形式组织时,应当参考这些规范。19.HELO电子邮件头中邮件发送者用来标识自己的身份的命令字段。 附录:电子邮件营销常用指标1. 发送量发送的营销电子邮件数量2. 到达量发送的营销电子邮件数量-退回的营销电子邮件数量3. 到达率到达接收方邮箱的营销电子邮件数量/发送的营销电子邮件数量×100%4. 退信率退回的营销电子邮件数量/发送的营销电子邮件数量×100%5. 硬退信率硬退回的营销电子邮件数量/发送的营销电子邮件数量×100%6. 软退信率软退回的营销电子邮件数量/发送的营销电子邮件数量×100%7. 打开率打开营销电子邮件的接收方数量/收到营销电子邮件的接收方数量×100%,不计算重复打开邮件的情况。8. 点击率点击了营销电子邮件内容中链接的接收方数量/收到营销电子邮件的接收方数量×100%,不计算重复点击的情况。9. 点击打开率点击了营销电子邮件内容中链接的接收方数量/打开营销电子邮件的接收方数量×100%,不计算重复点击和重复打开的情况。10. 退订率退订营销电子邮件的接收方数量/收到营销电子邮件的接收方数量×100%11. 投诉率被投诉的营销电子邮件数量/到达接收方邮箱的营销电子邮件数量×100%12. 信誉度邮件接收方或者第三方机构对营销电子邮件服务信誉和质量的评定结果 参考中华人民共和国信息产业部令第38号 互联网电子邮件服务管理办法中国互联网协会 电子邮件服务指南(V1.1)中国互联网协会 中国互联网协会互联网公共电子邮件服务规范YD-T 1310-2004 互联网广告电子邮件格式要求YD-T 1311-2004 防范互联网垃圾电子邮件技术要求

2019-12-01 23:24:47 0 浏览量 回答数 0

回答

详细解答可以参考官方帮助文档 阿里云任何版本的企业邮箱服务禁止发送营销邮件,营销邮件标准及相关规范,参见中国互联网协会反垃圾信息中心的管理规范。中国互联网协会电子邮件营销规范(V1.2)来源:反垃圾信息中心一、总则1.1 为规范电子邮件形式的市场营销行为,统一电子邮件营销[注1]的基本要求,为接收和发送营销内容的电子邮件提供依据,保护电子邮件用户的合法权益,根据我国相关法律法规的规定,制定本规范。1.2 本规范适用于电子邮件营销活动的开展和评价。1.3 本规范基于《互联网电子邮件服务管理办法》(中华人民共和国信息产业部令第38号)制定,从事电子邮件营销除应执行本规范外,还应符合《互联网电子邮件服务管理办法》及其他国家现行的有关标准的规定。二、基本规定2.1 中国互联网协会对电子邮件营销服务提供者[注2]实行登记备案管理。电子邮件营销服务提供者应当在开展电子邮件营销活动前将电子邮件发送服务器所使用的IP地址[注11]及相关信息向中国互联网协会反垃圾信息中心登记备案,并遵守以下规定:2.1.1需报备的 IP 地址及相关信息(1)备案单位基本情况,包括备案单位名称、备案单位地址、备案单位性质、备案单位组织机构代码、备案单位营业执照注册号、备案单位经营范围、备案单位注册资金、备案单位网站域名、备案单位法人代表姓名、备案单位联系人姓名、联系人电话、 联系人电子邮件、联系人即时通信方式等。(2)备案单位电子邮件发送服务器IP地址分配使用信息,包括备案单位用于发送电子邮件的IP地址数量、IP地址、IP地址段、IP地址所属单位名称、IP地址对应域名、IP地址对应发送营销电子邮件[注3]性质/类型(事务性邮件和商业性邮件等);(3)备案单位可自愿报备每次电子邮件营销活动的信息,包括本次营销活动使用IP地址、域名、发件人邮箱地址、电子邮件HELO[注19]信息、收件人数量、发送周期、平均发送速率[注10]、单IP最大发送速率、发送营销电子邮件性质/类型(事务性邮件和商业性邮件等)、营销电子邮件的原信/样信等。(4)其他需要备案的信息。2.1.2 电子邮件营销服务提供者拟变更电子邮件营销服务信息的,应当提前办理变更登记手续。2.1.3 电子邮件营销服务提供者提交的备案信息必须完整、真实、有效且符合我国相关法律法规规定。2.1.4 中国互联网协会反垃圾信息中心负责审核电子邮件营销服务提供者提交的备案资料,对符合要求的备案单位发放电子邮件营销备案资质证书。2.2 电子邮件营销服务提供者应当确保所有与电子邮件服务有关的域名和IP地址注册信息正确、完整和及时更新,并遵守以下规定:2.2.1 发送电子邮件的服务器IP地址必须使用静态IP[注12]地址,并已采取IP反向解析[注13]措施。2.2.2 发送电子邮件的邮箱域名建议与发送电子邮件的服务器IP反向解析的域名信息一致,并已采取SPF解析[注14]。2.2.3 建议使用DKIM[注15]、DMARC[注16]等反垃圾邮件技术,提高与电子邮件发送相关的域名和IP的信誉。2.2.4 关注知名的RBL[注17]组织列表,如果发现与电子邮件发送相关的域名、IP或邮箱地址出现在知名的RBL[注17]组织列表上,应及时采取措施进行申诉和解封。2.2.5 建议发送事务性邮件和商业性邮件的服务器分配不同的IP地址和发送邮箱地址。2.2.6 具有特殊功能的账户,如postmaster@账户(邮件管理员账户)或abuse@账户(投诉账户),必须保证其有效,并由专人负责管理维护。2.3 电子邮件营销服务提供者应当建立可靠有效的订阅[注5]及退订[注9]机制,并遵守以下规定:2.3.1未经电子邮件接收者明确许可,不得向其发送营销电子邮件。获取接收者许可的过程和内容应清楚、明确,且不违背我国的相关法律规定。电子邮件营销服务提供者应公布获取接收者许可的策略,保存接收者同意接收营销邮件的许可记录,以便在需要时向接收者提供相关信息。2.3.2营销电子邮件必须提供给接收者至少包含一种退订的途径和具体操作方法,退订信息应醒目、清晰,退订操作方法应简单,有效。2.3.3确保退订请求可以正常发送并能够被及时自动响应处理。不得强制要求用户提交退订原因或设置退订条件,退订请求发出后应在3个工作日内生效。2.4 电子邮件营销服务提供者应规范的使用和维护其营销用户[注4]的电子邮件地址列表[注6],并遵守以下规定:2.4.1 电子邮件营销服务提供者对营销用户的个人信息和电子邮件地址负有保密的义务。未经用户同意,不得泄露用户的个人信息和电子邮件地址,法律、行政法规另有规定的除外。2.4.2 电子邮件营销服务提供者应制定安全合理的隐私策略[注8]。营销用户的个人信息资料和电子邮件地址的使用应与收集目的一致,未经用户同意,不得用于收集目的以外的其它用途。2.4.3 必须保证每个电子邮件地址的取得都经过了用户的许可。尽量确保每个电子邮件地址都是真实有效的。2.4.4 应合理处理邮件投递过程中接收电子邮件的服务器返回的错误代码[注7]。对于返回代码表示不存在的电子邮件地址,应及时从发送列表中删除;对于连续出现投递错误的电子邮件地址,建议及时调整投递策略,减少可能导致错误发生的情况。2.5 电子邮件营销服务提供者应使用规范的电子邮件格式与内容,并遵守以下规定:2.5.1 营销电子邮件的内容不得违反我国相关法律法规规定。2.5.2 营销电子邮件格式应符合国际通用规范标准(参见RFC 2822)。邮件中如果包含HTML格式,应遵循由万维网联盟(W3C)公布的w3.org[注18]设计规范。2.5.3 营销电子邮件应标明邮件发送方的身份和真实的可返回的邮件发送地址。邮件的标题和信体要能准确的反映出邮件的内容、真实来源和通信目的。邮件正文应包含发送方的名称、地址、联系电话和电子邮件地址等详细信息。2.5.4 营销电子邮件的主题与内容必须相匹配。邮件内容应与营销用户的订阅内容一致。2.5.5 应采取有效的措施保护未成年人,尽可能的识别未成年的邮件订阅者。营销电子邮件含有不适合未成年人阅读的内容时,应提前核实接收者的年龄,确保接收者达到合法接收和阅读的年龄。发送给未成年人的营销邮件应征得其监护人的许可,内容符合此年龄段人群的知识水准、阅历和心里成熟程度。2.6 电子邮件营销服务提供者应与邮件接收方建立良好的沟通渠道,并参考以下规定:2.6.1 中国互联网协会反垃圾信息中心负责协助电子邮件营销服务提供者与邮件接收组织之间的沟通协调,在邮件传送过程中出现问题时,及时有效的进行沟通,确保尽快使问题得到解决。2.6.2 中国互联网协会反垃圾信息中心应协助电子邮件营销服务提供者与邮件接收组织之间建立信息反馈机制,改进电子邮件营销服务提供者的服务水平。2.6.3 中国互联网协会反垃圾信息中心应对电子邮件营销活动进行监督,对电子邮件营销服务提供者的信誉进行评价。2.6.4 电子邮件营销服务提供者应建立公平、高效、安全、易于使用的邮件投诉系统,在营销电子邮件中为营销用户提供便捷的投诉方式,受理营销用户对营销电子邮件的投诉。对被投诉的营销电子邮件,应立即开展调查,采取合理有效的防范或处理措施,并将有关情况和调查结果及时向各省通信管理局等国家有关机关或者12321网络不良和垃圾信息举报受理中心报告。2.6.5 电子邮件营销服务提供者应按照邮件接收方的要求限制营销电子邮件的发送速率。邮件接收方应将未投递成功的电子邮件服务器错误信息反馈邮件发送方。对信誉良好,行为规范的电子邮件营销服务提供者,邮件接收方可适当放宽营销电子邮件的发送速率。2.7 电子邮件营销服务提供者应积极配合各省通信管理局等国家有关机关和12321网络不良和垃圾信息举报受理中心开展调查工作。2.8 中国互联网协会拥有本规范的解释权和修改权。2.9 本规范自发布之日起施行。 附注:1. 电子邮件营销:指通过电子邮件开展的营销活动。2. 电子邮件营销服务提供者:也是营销电子邮件的发送方,指提供电子邮件营销服务的单位或个人,包括直接开展电子邮件营销活动的单位或个人以及接受委托开展电子邮件营销活动的单位或个人。3. 营销电子邮件:指具有营销功能的电子邮件。根据电子邮件的发送目的,分为事务性邮件和商业性邮件两种类型。3.1 事务性邮件,是指由收件人触发并已允许发件人发送的,以推动、完成或确认相关联流程为主要目的而发送的电子邮件。常见分类包括:(1)账号相关:账号激活、信息验证、账号绑定、密码修改、密码取回等。(2)交易信息:订单通知、付款通知、退款通知、物流通知、交易投诉等。(3)账单信息:对帐单、流水账单、催款通知、账户变更等。(4)其他类型。3.2 商业性邮件,是指任何以推销或者推广某种商品或服务(包括商业性网站的内容)为主要目的而发送的电子邮件。常见分类包括:(1)期刊资讯:更新通知、各类期刊、各类报表等。(2)产品促销:新品推广、季末促销、优惠套餐、折扣优惠、积分优惠等。(3)成员营销:好友邀请、成员关怀、主题活动、用户调研等。(4)其他类型。3.3 事务性邮件如果附带商业性内容,则视为商业性邮件。4. 营销用户:指电子邮件营销活动的对象,即接收营销电子邮件的电子邮箱使用者。5. 订阅:指营销用户预先订制,同意接收订制的营销电子邮件的行为。6. 邮件列表:指已经订阅了某一类营销电子邮件的用户电子邮箱地址列表,该列表是此类营销电子邮件的发送对象。7. 错误代码/硬退回/软退回:指在邮件的SMTP发送过程中,收信方服务器每处理完一条SMTP命令,都会向发信方服务器回传一个返回信息,用于表明对这条SMTP命令的执行结果。如返回信息以4XX(如450等)开头,指接收方临时性拒收该邮件,称软退回;如返回信息以5XX(如550等)开头,指接收方永久性拒收该邮件,称硬退回。以上列举的两类代码,习惯称为错误代码。8. 隐私策略:指电子邮件营销活动所收集的营销用户信息类型,收集方式和收集技术,以及信息的提供对象和使用用途。隐私策略中还应包括用户信息保护的安全措施、责任和实施过程。9. 退订:指营销用户取消订阅营销电子邮件的行为。10. 发送速率:指单位时间内的发送电子邮件的总数量。 常见的时间间隔单位包括:分钟、15分钟、小时、天、周、月等。11. IP地址/IP段IP地址是被用于定位互联网上的电脑一个唯一编号,地址的格式如159.226.1.1。多个IP地址的组合,即称为IP段。邮件发送过程中会?谰軮P地址,来确定邮件发送者和邮件接收者的位置。12. 静态IP地址指长期固定分配给一台计算机使用的IP地址,一般是由网络运营商分配。13. IP反向解析IP反向解析是一项常用的反垃圾邮件技术。常用的DNS服务器里面有两个区域,即“正向查找区域”和“反向查找区域”。正向查找区域是指域名解析,反向查找区域即是IP反向解析,简称PTR记录,其作用是通过查询IP地址的PTR记录来得到该IP地址指向的域名。PTR记录需要由提供IP地址的网络运营商(ISP)进行配置。14. SPFSPF(Sender Policy Framework)是一种通过IP地址来认证电子邮件发件人身份的技术,是一项非常高效的反垃圾邮件技术。它通过在DNS中发布一条TXT类型的记录,用于登记某个域名所有拥有的合法的发送邮件的所有IP地址。15. DKIMDKIM(DomainKeys Identified Mail)是一种防诈骗邮件的反垃圾邮件技术。DKIM要求邮件发送方在电子邮件的信头插入DKIM-Signature及电子签名信息,而邮件接收方则通过DNS查询得到其公钥然后进行合法性验证。16. DMARCDMARC(Domain-based Message Authentication, Reporting and Conformance)是一种防诈骗邮件的反垃圾邮件技术。DMARC结合SPF和DKIM两项技术,通过检查电子邮件信头的发件人的合法性,将诈骗邮件识别出来。17. RBLRBL(Real-time Blackhole List),即实时黑名单列表,是一些由国际知名的反垃圾邮件组织所提供的恶意发送垃圾邮件的发件人邮箱地址,IP地址,URL地址等黑名单列表的服务。若已被RBL收录,需到相应RBL官方网站上去核实并申请移除。常见的知名RBL组织,如中国互联网协会反垃圾信息中心、spamhaus,Maps,sorbs,uribl,surbl等。18. w3.org规范由万维网联盟(W3C)共同开发与公布的各种web设计规范。当邮件正文以网页的形式组织时,应当参考这些规范。19.HELO电子邮件头中邮件发送者用来标识自己的身份的命令字段。 附录:电子邮件营销常用指标1. 发送量发送的营销电子邮件数量2. 到达量发送的营销电子邮件数量-退回的营销电子邮件数量3. 到达率到达接收方邮箱的营销电子邮件数量/发送的营销电子邮件数量×100%4. 退信率退回的营销电子邮件数量/发送的营销电子邮件数量×100%5. 硬退信率硬退回的营销电子邮件数量/发送的营销电子邮件数量×100%6. 软退信率软退回的营销电子邮件数量/发送的营销电子邮件数量×100%7. 打开率打开营销电子邮件的接收方数量/收到营销电子邮件的接收方数量×100%,不计算重复打开邮件的情况。8. 点击率点击了营销电子邮件内容中链接的接收方数量/收到营销电子邮件的接收方数量×100%,不计算重复点击的情况。9. 点击打开率点击了营销电子邮件内容中链接的接收方数量/打开营销电子邮件的接收方数量×100%,不计算重复点击和重复打开的情况。10. 退订率退订营销电子邮件的接收方数量/收到营销电子邮件的接收方数量×100%11. 投诉率被投诉的营销电子邮件数量/到达接收方邮箱的营销电子邮件数量×100%12. 信誉度邮件接收方或者第三方机构对营销电子邮件服务信誉和质量的评定结果 参考中华人民共和国信息产业部令第38号 互联网电子邮件服务管理办法中国互联网协会 电子邮件服务指南(V1.1)中国互联网协会 中国互联网协会互联网公共电子邮件服务规范YD-T 1310-2004 互联网广告电子邮件格式要求YD-T 1311-2004 防范互联网垃圾电子邮件技术要求

2019-12-01 23:24:47 0 浏览量 回答数 0

回答

详细解答可以参考官方帮助文档 阿里云任何版本的企业邮箱服务禁止发送营销邮件,营销邮件标准及相关规范,参见中国互联网协会反垃圾信息中心的管理规范。中国互联网协会电子邮件营销规范(V1.2)来源:反垃圾信息中心一、总则1.1 为规范电子邮件形式的市场营销行为,统一电子邮件营销[注1]的基本要求,为接收和发送营销内容的电子邮件提供依据,保护电子邮件用户的合法权益,根据我国相关法律法规的规定,制定本规范。1.2 本规范适用于电子邮件营销活动的开展和评价。1.3 本规范基于《互联网电子邮件服务管理办法》(中华人民共和国信息产业部令第38号)制定,从事电子邮件营销除应执行本规范外,还应符合《互联网电子邮件服务管理办法》及其他国家现行的有关标准的规定。二、基本规定2.1 中国互联网协会对电子邮件营销服务提供者[注2]实行登记备案管理。电子邮件营销服务提供者应当在开展电子邮件营销活动前将电子邮件发送服务器所使用的IP地址[注11]及相关信息向中国互联网协会反垃圾信息中心登记备案,并遵守以下规定:2.1.1需报备的 IP 地址及相关信息(1)备案单位基本情况,包括备案单位名称、备案单位地址、备案单位性质、备案单位组织机构代码、备案单位营业执照注册号、备案单位经营范围、备案单位注册资金、备案单位网站域名、备案单位法人代表姓名、备案单位联系人姓名、联系人电话、 联系人电子邮件、联系人即时通信方式等。(2)备案单位电子邮件发送服务器IP地址分配使用信息,包括备案单位用于发送电子邮件的IP地址数量、IP地址、IP地址段、IP地址所属单位名称、IP地址对应域名、IP地址对应发送营销电子邮件[注3]性质/类型(事务性邮件和商业性邮件等);(3)备案单位可自愿报备每次电子邮件营销活动的信息,包括本次营销活动使用IP地址、域名、发件人邮箱地址、电子邮件HELO[注19]信息、收件人数量、发送周期、平均发送速率[注10]、单IP最大发送速率、发送营销电子邮件性质/类型(事务性邮件和商业性邮件等)、营销电子邮件的原信/样信等。(4)其他需要备案的信息。2.1.2 电子邮件营销服务提供者拟变更电子邮件营销服务信息的,应当提前办理变更登记手续。2.1.3 电子邮件营销服务提供者提交的备案信息必须完整、真实、有效且符合我国相关法律法规规定。2.1.4 中国互联网协会反垃圾信息中心负责审核电子邮件营销服务提供者提交的备案资料,对符合要求的备案单位发放电子邮件营销备案资质证书。2.2 电子邮件营销服务提供者应当确保所有与电子邮件服务有关的域名和IP地址注册信息正确、完整和及时更新,并遵守以下规定:2.2.1 发送电子邮件的服务器IP地址必须使用静态IP[注12]地址,并已采取IP反向解析[注13]措施。2.2.2 发送电子邮件的邮箱域名建议与发送电子邮件的服务器IP反向解析的域名信息一致,并已采取SPF解析[注14]。2.2.3 建议使用DKIM[注15]、DMARC[注16]等反垃圾邮件技术,提高与电子邮件发送相关的域名和IP的信誉。2.2.4 关注知名的RBL[注17]组织列表,如果发现与电子邮件发送相关的域名、IP或邮箱地址出现在知名的RBL[注17]组织列表上,应及时采取措施进行申诉和解封。2.2.5 建议发送事务性邮件和商业性邮件的服务器分配不同的IP地址和发送邮箱地址。2.2.6 具有特殊功能的账户,如postmaster@账户(邮件管理员账户)或abuse@账户(投诉账户),必须保证其有效,并由专人负责管理维护。2.3 电子邮件营销服务提供者应当建立可靠有效的订阅[注5]及退订[注9]机制,并遵守以下规定:2.3.1未经电子邮件接收者明确许可,不得向其发送营销电子邮件。获取接收者许可的过程和内容应清楚、明确,且不违背我国的相关法律规定。电子邮件营销服务提供者应公布获取接收者许可的策略,保存接收者同意接收营销邮件的许可记录,以便在需要时向接收者提供相关信息。2.3.2营销电子邮件必须提供给接收者至少包含一种退订的途径和具体操作方法,退订信息应醒目、清晰,退订操作方法应简单,有效。2.3.3确保退订请求可以正常发送并能够被及时自动响应处理。不得强制要求用户提交退订原因或设置退订条件,退订请求发出后应在3个工作日内生效。2.4 电子邮件营销服务提供者应规范的使用和维护其营销用户[注4]的电子邮件地址列表[注6],并遵守以下规定:2.4.1 电子邮件营销服务提供者对营销用户的个人信息和电子邮件地址负有保密的义务。未经用户同意,不得泄露用户的个人信息和电子邮件地址,法律、行政法规另有规定的除外。2.4.2 电子邮件营销服务提供者应制定安全合理的隐私策略[注8]。营销用户的个人信息资料和电子邮件地址的使用应与收集目的一致,未经用户同意,不得用于收集目的以外的其它用途。2.4.3 必须保证每个电子邮件地址的取得都经过了用户的许可。尽量确保每个电子邮件地址都是真实有效的。2.4.4 应合理处理邮件投递过程中接收电子邮件的服务器返回的错误代码[注7]。对于返回代码表示不存在的电子邮件地址,应及时从发送列表中删除;对于连续出现投递错误的电子邮件地址,建议及时调整投递策略,减少可能导致错误发生的情况。2.5 电子邮件营销服务提供者应使用规范的电子邮件格式与内容,并遵守以下规定:2.5.1 营销电子邮件的内容不得违反我国相关法律法规规定。2.5.2 营销电子邮件格式应符合国际通用规范标准(参见RFC 2822)。邮件中如果包含HTML格式,应遵循由万维网联盟(W3C)公布的w3.org[注18]设计规范。2.5.3 营销电子邮件应标明邮件发送方的身份和真实的可返回的邮件发送地址。邮件的标题和信体要能准确的反映出邮件的内容、真实来源和通信目的。邮件正文应包含发送方的名称、地址、联系电话和电子邮件地址等详细信息。2.5.4 营销电子邮件的主题与内容必须相匹配。邮件内容应与营销用户的订阅内容一致。2.5.5 应采取有效的措施保护未成年人,尽可能的识别未成年的邮件订阅者。营销电子邮件含有不适合未成年人阅读的内容时,应提前核实接收者的年龄,确保接收者达到合法接收和阅读的年龄。发送给未成年人的营销邮件应征得其监护人的许可,内容符合此年龄段人群的知识水准、阅历和心里成熟程度。2.6 电子邮件营销服务提供者应与邮件接收方建立良好的沟通渠道,并参考以下规定:2.6.1 中国互联网协会反垃圾信息中心负责协助电子邮件营销服务提供者与邮件接收组织之间的沟通协调,在邮件传送过程中出现问题时,及时有效的进行沟通,确保尽快使问题得到解决。2.6.2 中国互联网协会反垃圾信息中心应协助电子邮件营销服务提供者与邮件接收组织之间建立信息反馈机制,改进电子邮件营销服务提供者的服务水平。2.6.3 中国互联网协会反垃圾信息中心应对电子邮件营销活动进行监督,对电子邮件营销服务提供者的信誉进行评价。2.6.4 电子邮件营销服务提供者应建立公平、高效、安全、易于使用的邮件投诉系统,在营销电子邮件中为营销用户提供便捷的投诉方式,受理营销用户对营销电子邮件的投诉。对被投诉的营销电子邮件,应立即开展调查,采取合理有效的防范或处理措施,并将有关情况和调查结果及时向各省通信管理局等国家有关机关或者12321网络不良和垃圾信息举报受理中心报告。2.6.5 电子邮件营销服务提供者应按照邮件接收方的要求限制营销电子邮件的发送速率。邮件接收方应将未投递成功的电子邮件服务器错误信息反馈邮件发送方。对信誉良好,行为规范的电子邮件营销服务提供者,邮件接收方可适当放宽营销电子邮件的发送速率。2.7 电子邮件营销服务提供者应积极配合各省通信管理局等国家有关机关和12321网络不良和垃圾信息举报受理中心开展调查工作。2.8 中国互联网协会拥有本规范的解释权和修改权。2.9 本规范自发布之日起施行。 附注:1. 电子邮件营销:指通过电子邮件开展的营销活动。2. 电子邮件营销服务提供者:也是营销电子邮件的发送方,指提供电子邮件营销服务的单位或个人,包括直接开展电子邮件营销活动的单位或个人以及接受委托开展电子邮件营销活动的单位或个人。3. 营销电子邮件:指具有营销功能的电子邮件。根据电子邮件的发送目的,分为事务性邮件和商业性邮件两种类型。3.1 事务性邮件,是指由收件人触发并已允许发件人发送的,以推动、完成或确认相关联流程为主要目的而发送的电子邮件。常见分类包括:(1)账号相关:账号激活、信息验证、账号绑定、密码修改、密码取回等。(2)交易信息:订单通知、付款通知、退款通知、物流通知、交易投诉等。(3)账单信息:对帐单、流水账单、催款通知、账户变更等。(4)其他类型。3.2 商业性邮件,是指任何以推销或者推广某种商品或服务(包括商业性网站的内容)为主要目的而发送的电子邮件。常见分类包括:(1)期刊资讯:更新通知、各类期刊、各类报表等。(2)产品促销:新品推广、季末促销、优惠套餐、折扣优惠、积分优惠等。(3)成员营销:好友邀请、成员关怀、主题活动、用户调研等。(4)其他类型。3.3 事务性邮件如果附带商业性内容,则视为商业性邮件。4. 营销用户:指电子邮件营销活动的对象,即接收营销电子邮件的电子邮箱使用者。5. 订阅:指营销用户预先订制,同意接收订制的营销电子邮件的行为。6. 邮件列表:指已经订阅了某一类营销电子邮件的用户电子邮箱地址列表,该列表是此类营销电子邮件的发送对象。7. 错误代码/硬退回/软退回:指在邮件的SMTP发送过程中,收信方服务器每处理完一条SMTP命令,都会向发信方服务器回传一个返回信息,用于表明对这条SMTP命令的执行结果。如返回信息以4XX(如450等)开头,指接收方临时性拒收该邮件,称软退回;如返回信息以5XX(如550等)开头,指接收方永久性拒收该邮件,称硬退回。以上列举的两类代码,习惯称为错误代码。8. 隐私策略:指电子邮件营销活动所收集的营销用户信息类型,收集方式和收集技术,以及信息的提供对象和使用用途。隐私策略中还应包括用户信息保护的安全措施、责任和实施过程。9. 退订:指营销用户取消订阅营销电子邮件的行为。10. 发送速率:指单位时间内的发送电子邮件的总数量。 常见的时间间隔单位包括:分钟、15分钟、小时、天、周、月等。11. IP地址/IP段IP地址是被用于定位互联网上的电脑一个唯一编号,地址的格式如159.226.1.1。多个IP地址的组合,即称为IP段。邮件发送过程中会?谰軮P地址,来确定邮件发送者和邮件接收者的位置。12. 静态IP地址指长期固定分配给一台计算机使用的IP地址,一般是由网络运营商分配。13. IP反向解析IP反向解析是一项常用的反垃圾邮件技术。常用的DNS服务器里面有两个区域,即“正向查找区域”和“反向查找区域”。正向查找区域是指域名解析,反向查找区域即是IP反向解析,简称PTR记录,其作用是通过查询IP地址的PTR记录来得到该IP地址指向的域名。PTR记录需要由提供IP地址的网络运营商(ISP)进行配置。14. SPFSPF(Sender Policy Framework)是一种通过IP地址来认证电子邮件发件人身份的技术,是一项非常高效的反垃圾邮件技术。它通过在DNS中发布一条TXT类型的记录,用于登记某个域名所有拥有的合法的发送邮件的所有IP地址。15. DKIMDKIM(DomainKeys Identified Mail)是一种防诈骗邮件的反垃圾邮件技术。DKIM要求邮件发送方在电子邮件的信头插入DKIM-Signature及电子签名信息,而邮件接收方则通过DNS查询得到其公钥然后进行合法性验证。16. DMARCDMARC(Domain-based Message Authentication, Reporting and Conformance)是一种防诈骗邮件的反垃圾邮件技术。DMARC结合SPF和DKIM两项技术,通过检查电子邮件信头的发件人的合法性,将诈骗邮件识别出来。17. RBLRBL(Real-time Blackhole List),即实时黑名单列表,是一些由国际知名的反垃圾邮件组织所提供的恶意发送垃圾邮件的发件人邮箱地址,IP地址,URL地址等黑名单列表的服务。若已被RBL收录,需到相应RBL官方网站上去核实并申请移除。常见的知名RBL组织,如中国互联网协会反垃圾信息中心、spamhaus,Maps,sorbs,uribl,surbl等。18. w3.org规范由万维网联盟(W3C)共同开发与公布的各种web设计规范。当邮件正文以网页的形式组织时,应当参考这些规范。19.HELO电子邮件头中邮件发送者用来标识自己的身份的命令字段。 附录:电子邮件营销常用指标1. 发送量发送的营销电子邮件数量2. 到达量发送的营销电子邮件数量-退回的营销电子邮件数量3. 到达率到达接收方邮箱的营销电子邮件数量/发送的营销电子邮件数量×100%4. 退信率退回的营销电子邮件数量/发送的营销电子邮件数量×100%5. 硬退信率硬退回的营销电子邮件数量/发送的营销电子邮件数量×100%6. 软退信率软退回的营销电子邮件数量/发送的营销电子邮件数量×100%7. 打开率打开营销电子邮件的接收方数量/收到营销电子邮件的接收方数量×100%,不计算重复打开邮件的情况。8. 点击率点击了营销电子邮件内容中链接的接收方数量/收到营销电子邮件的接收方数量×100%,不计算重复点击的情况。9. 点击打开率点击了营销电子邮件内容中链接的接收方数量/打开营销电子邮件的接收方数量×100%,不计算重复点击和重复打开的情况。10. 退订率退订营销电子邮件的接收方数量/收到营销电子邮件的接收方数量×100%11. 投诉率被投诉的营销电子邮件数量/到达接收方邮箱的营销电子邮件数量×100%12. 信誉度邮件接收方或者第三方机构对营销电子邮件服务信誉和质量的评定结果 参考中华人民共和国信息产业部令第38号 互联网电子邮件服务管理办法中国互联网协会 电子邮件服务指南(V1.1)中国互联网协会 中国互联网协会互联网公共电子邮件服务规范YD-T 1310-2004 互联网广告电子邮件格式要求YD-T 1311-2004 防范互联网垃圾电子邮件技术要求

2019-12-01 23:24:47 0 浏览量 回答数 0

回答

详细解答可以参考官方帮助文档 阿里云任何版本的企业邮箱服务禁止发送营销邮件,营销邮件标准及相关规范,参见中国互联网协会反垃圾信息中心的管理规范。中国互联网协会电子邮件营销规范(V1.2)来源:反垃圾信息中心一、总则1.1 为规范电子邮件形式的市场营销行为,统一电子邮件营销[注1]的基本要求,为接收和发送营销内容的电子邮件提供依据,保护电子邮件用户的合法权益,根据我国相关法律法规的规定,制定本规范。1.2 本规范适用于电子邮件营销活动的开展和评价。1.3 本规范基于《互联网电子邮件服务管理办法》(中华人民共和国信息产业部令第38号)制定,从事电子邮件营销除应执行本规范外,还应符合《互联网电子邮件服务管理办法》及其他国家现行的有关标准的规定。二、基本规定2.1 中国互联网协会对电子邮件营销服务提供者[注2]实行登记备案管理。电子邮件营销服务提供者应当在开展电子邮件营销活动前将电子邮件发送服务器所使用的IP地址[注11]及相关信息向中国互联网协会反垃圾信息中心登记备案,并遵守以下规定:2.1.1需报备的 IP 地址及相关信息(1)备案单位基本情况,包括备案单位名称、备案单位地址、备案单位性质、备案单位组织机构代码、备案单位营业执照注册号、备案单位经营范围、备案单位注册资金、备案单位网站域名、备案单位法人代表姓名、备案单位联系人姓名、联系人电话、 联系人电子邮件、联系人即时通信方式等。(2)备案单位电子邮件发送服务器IP地址分配使用信息,包括备案单位用于发送电子邮件的IP地址数量、IP地址、IP地址段、IP地址所属单位名称、IP地址对应域名、IP地址对应发送营销电子邮件[注3]性质/类型(事务性邮件和商业性邮件等);(3)备案单位可自愿报备每次电子邮件营销活动的信息,包括本次营销活动使用IP地址、域名、发件人邮箱地址、电子邮件HELO[注19]信息、收件人数量、发送周期、平均发送速率[注10]、单IP最大发送速率、发送营销电子邮件性质/类型(事务性邮件和商业性邮件等)、营销电子邮件的原信/样信等。(4)其他需要备案的信息。2.1.2 电子邮件营销服务提供者拟变更电子邮件营销服务信息的,应当提前办理变更登记手续。2.1.3 电子邮件营销服务提供者提交的备案信息必须完整、真实、有效且符合我国相关法律法规规定。2.1.4 中国互联网协会反垃圾信息中心负责审核电子邮件营销服务提供者提交的备案资料,对符合要求的备案单位发放电子邮件营销备案资质证书。2.2 电子邮件营销服务提供者应当确保所有与电子邮件服务有关的域名和IP地址注册信息正确、完整和及时更新,并遵守以下规定:2.2.1 发送电子邮件的服务器IP地址必须使用静态IP[注12]地址,并已采取IP反向解析[注13]措施。2.2.2 发送电子邮件的邮箱域名建议与发送电子邮件的服务器IP反向解析的域名信息一致,并已采取SPF解析[注14]。2.2.3 建议使用DKIM[注15]、DMARC[注16]等反垃圾邮件技术,提高与电子邮件发送相关的域名和IP的信誉。2.2.4 关注知名的RBL[注17]组织列表,如果发现与电子邮件发送相关的域名、IP或邮箱地址出现在知名的RBL[注17]组织列表上,应及时采取措施进行申诉和解封。2.2.5 建议发送事务性邮件和商业性邮件的服务器分配不同的IP地址和发送邮箱地址。2.2.6 具有特殊功能的账户,如postmaster@账户(邮件管理员账户)或abuse@账户(投诉账户),必须保证其有效,并由专人负责管理维护。2.3 电子邮件营销服务提供者应当建立可靠有效的订阅[注5]及退订[注9]机制,并遵守以下规定:2.3.1未经电子邮件接收者明确许可,不得向其发送营销电子邮件。获取接收者许可的过程和内容应清楚、明确,且不违背我国的相关法律规定。电子邮件营销服务提供者应公布获取接收者许可的策略,保存接收者同意接收营销邮件的许可记录,以便在需要时向接收者提供相关信息。2.3.2营销电子邮件必须提供给接收者至少包含一种退订的途径和具体操作方法,退订信息应醒目、清晰,退订操作方法应简单,有效。2.3.3确保退订请求可以正常发送并能够被及时自动响应处理。不得强制要求用户提交退订原因或设置退订条件,退订请求发出后应在3个工作日内生效。2.4 电子邮件营销服务提供者应规范的使用和维护其营销用户[注4]的电子邮件地址列表[注6],并遵守以下规定:2.4.1 电子邮件营销服务提供者对营销用户的个人信息和电子邮件地址负有保密的义务。未经用户同意,不得泄露用户的个人信息和电子邮件地址,法律、行政法规另有规定的除外。2.4.2 电子邮件营销服务提供者应制定安全合理的隐私策略[注8]。营销用户的个人信息资料和电子邮件地址的使用应与收集目的一致,未经用户同意,不得用于收集目的以外的其它用途。2.4.3 必须保证每个电子邮件地址的取得都经过了用户的许可。尽量确保每个电子邮件地址都是真实有效的。2.4.4 应合理处理邮件投递过程中接收电子邮件的服务器返回的错误代码[注7]。对于返回代码表示不存在的电子邮件地址,应及时从发送列表中删除;对于连续出现投递错误的电子邮件地址,建议及时调整投递策略,减少可能导致错误发生的情况。2.5 电子邮件营销服务提供者应使用规范的电子邮件格式与内容,并遵守以下规定:2.5.1 营销电子邮件的内容不得违反我国相关法律法规规定。2.5.2 营销电子邮件格式应符合国际通用规范标准(参见RFC 2822)。邮件中如果包含HTML格式,应遵循由万维网联盟(W3C)公布的w3.org[注18]设计规范。2.5.3 营销电子邮件应标明邮件发送方的身份和真实的可返回的邮件发送地址。邮件的标题和信体要能准确的反映出邮件的内容、真实来源和通信目的。邮件正文应包含发送方的名称、地址、联系电话和电子邮件地址等详细信息。2.5.4 营销电子邮件的主题与内容必须相匹配。邮件内容应与营销用户的订阅内容一致。2.5.5 应采取有效的措施保护未成年人,尽可能的识别未成年的邮件订阅者。营销电子邮件含有不适合未成年人阅读的内容时,应提前核实接收者的年龄,确保接收者达到合法接收和阅读的年龄。发送给未成年人的营销邮件应征得其监护人的许可,内容符合此年龄段人群的知识水准、阅历和心里成熟程度。2.6 电子邮件营销服务提供者应与邮件接收方建立良好的沟通渠道,并参考以下规定:2.6.1 中国互联网协会反垃圾信息中心负责协助电子邮件营销服务提供者与邮件接收组织之间的沟通协调,在邮件传送过程中出现问题时,及时有效的进行沟通,确保尽快使问题得到解决。2.6.2 中国互联网协会反垃圾信息中心应协助电子邮件营销服务提供者与邮件接收组织之间建立信息反馈机制,改进电子邮件营销服务提供者的服务水平。2.6.3 中国互联网协会反垃圾信息中心应对电子邮件营销活动进行监督,对电子邮件营销服务提供者的信誉进行评价。2.6.4 电子邮件营销服务提供者应建立公平、高效、安全、易于使用的邮件投诉系统,在营销电子邮件中为营销用户提供便捷的投诉方式,受理营销用户对营销电子邮件的投诉。对被投诉的营销电子邮件,应立即开展调查,采取合理有效的防范或处理措施,并将有关情况和调查结果及时向各省通信管理局等国家有关机关或者12321网络不良和垃圾信息举报受理中心报告。2.6.5 电子邮件营销服务提供者应按照邮件接收方的要求限制营销电子邮件的发送速率。邮件接收方应将未投递成功的电子邮件服务器错误信息反馈邮件发送方。对信誉良好,行为规范的电子邮件营销服务提供者,邮件接收方可适当放宽营销电子邮件的发送速率。2.7 电子邮件营销服务提供者应积极配合各省通信管理局等国家有关机关和12321网络不良和垃圾信息举报受理中心开展调查工作。2.8 中国互联网协会拥有本规范的解释权和修改权。2.9 本规范自发布之日起施行。 附注:1. 电子邮件营销:指通过电子邮件开展的营销活动。2. 电子邮件营销服务提供者:也是营销电子邮件的发送方,指提供电子邮件营销服务的单位或个人,包括直接开展电子邮件营销活动的单位或个人以及接受委托开展电子邮件营销活动的单位或个人。3. 营销电子邮件:指具有营销功能的电子邮件。根据电子邮件的发送目的,分为事务性邮件和商业性邮件两种类型。3.1 事务性邮件,是指由收件人触发并已允许发件人发送的,以推动、完成或确认相关联流程为主要目的而发送的电子邮件。常见分类包括:(1)账号相关:账号激活、信息验证、账号绑定、密码修改、密码取回等。(2)交易信息:订单通知、付款通知、退款通知、物流通知、交易投诉等。(3)账单信息:对帐单、流水账单、催款通知、账户变更等。(4)其他类型。3.2 商业性邮件,是指任何以推销或者推广某种商品或服务(包括商业性网站的内容)为主要目的而发送的电子邮件。常见分类包括:(1)期刊资讯:更新通知、各类期刊、各类报表等。(2)产品促销:新品推广、季末促销、优惠套餐、折扣优惠、积分优惠等。(3)成员营销:好友邀请、成员关怀、主题活动、用户调研等。(4)其他类型。3.3 事务性邮件如果附带商业性内容,则视为商业性邮件。4. 营销用户:指电子邮件营销活动的对象,即接收营销电子邮件的电子邮箱使用者。5. 订阅:指营销用户预先订制,同意接收订制的营销电子邮件的行为。6. 邮件列表:指已经订阅了某一类营销电子邮件的用户电子邮箱地址列表,该列表是此类营销电子邮件的发送对象。7. 错误代码/硬退回/软退回:指在邮件的SMTP发送过程中,收信方服务器每处理完一条SMTP命令,都会向发信方服务器回传一个返回信息,用于表明对这条SMTP命令的执行结果。如返回信息以4XX(如450等)开头,指接收方临时性拒收该邮件,称软退回;如返回信息以5XX(如550等)开头,指接收方永久性拒收该邮件,称硬退回。以上列举的两类代码,习惯称为错误代码。8. 隐私策略:指电子邮件营销活动所收集的营销用户信息类型,收集方式和收集技术,以及信息的提供对象和使用用途。隐私策略中还应包括用户信息保护的安全措施、责任和实施过程。9. 退订:指营销用户取消订阅营销电子邮件的行为。10. 发送速率:指单位时间内的发送电子邮件的总数量。 常见的时间间隔单位包括:分钟、15分钟、小时、天、周、月等。11. IP地址/IP段IP地址是被用于定位互联网上的电脑一个唯一编号,地址的格式如159.226.1.1。多个IP地址的组合,即称为IP段。邮件发送过程中会?谰軮P地址,来确定邮件发送者和邮件接收者的位置。12. 静态IP地址指长期固定分配给一台计算机使用的IP地址,一般是由网络运营商分配。13. IP反向解析IP反向解析是一项常用的反垃圾邮件技术。常用的DNS服务器里面有两个区域,即“正向查找区域”和“反向查找区域”。正向查找区域是指域名解析,反向查找区域即是IP反向解析,简称PTR记录,其作用是通过查询IP地址的PTR记录来得到该IP地址指向的域名。PTR记录需要由提供IP地址的网络运营商(ISP)进行配置。14. SPFSPF(Sender Policy Framework)是一种通过IP地址来认证电子邮件发件人身份的技术,是一项非常高效的反垃圾邮件技术。它通过在DNS中发布一条TXT类型的记录,用于登记某个域名所有拥有的合法的发送邮件的所有IP地址。15. DKIMDKIM(DomainKeys Identified Mail)是一种防诈骗邮件的反垃圾邮件技术。DKIM要求邮件发送方在电子邮件的信头插入DKIM-Signature及电子签名信息,而邮件接收方则通过DNS查询得到其公钥然后进行合法性验证。16. DMARCDMARC(Domain-based Message Authentication, Reporting and Conformance)是一种防诈骗邮件的反垃圾邮件技术。DMARC结合SPF和DKIM两项技术,通过检查电子邮件信头的发件人的合法性,将诈骗邮件识别出来。17. RBLRBL(Real-time Blackhole List),即实时黑名单列表,是一些由国际知名的反垃圾邮件组织所提供的恶意发送垃圾邮件的发件人邮箱地址,IP地址,URL地址等黑名单列表的服务。若已被RBL收录,需到相应RBL官方网站上去核实并申请移除。常见的知名RBL组织,如中国互联网协会反垃圾信息中心、spamhaus,Maps,sorbs,uribl,surbl等。18. w3.org规范由万维网联盟(W3C)共同开发与公布的各种web设计规范。当邮件正文以网页的形式组织时,应当参考这些规范。19.HELO电子邮件头中邮件发送者用来标识自己的身份的命令字段。 附录:电子邮件营销常用指标1. 发送量发送的营销电子邮件数量2. 到达量发送的营销电子邮件数量-退回的营销电子邮件数量3. 到达率到达接收方邮箱的营销电子邮件数量/发送的营销电子邮件数量×100%4. 退信率退回的营销电子邮件数量/发送的营销电子邮件数量×100%5. 硬退信率硬退回的营销电子邮件数量/发送的营销电子邮件数量×100%6. 软退信率软退回的营销电子邮件数量/发送的营销电子邮件数量×100%7. 打开率打开营销电子邮件的接收方数量/收到营销电子邮件的接收方数量×100%,不计算重复打开邮件的情况。8. 点击率点击了营销电子邮件内容中链接的接收方数量/收到营销电子邮件的接收方数量×100%,不计算重复点击的情况。9. 点击打开率点击了营销电子邮件内容中链接的接收方数量/打开营销电子邮件的接收方数量×100%,不计算重复点击和重复打开的情况。10. 退订率退订营销电子邮件的接收方数量/收到营销电子邮件的接收方数量×100%11. 投诉率被投诉的营销电子邮件数量/到达接收方邮箱的营销电子邮件数量×100%12. 信誉度邮件接收方或者第三方机构对营销电子邮件服务信誉和质量的评定结果 参考中华人民共和国信息产业部令第38号 互联网电子邮件服务管理办法中国互联网协会 电子邮件服务指南(V1.1)中国互联网协会 中国互联网协会互联网公共电子邮件服务规范YD-T 1310-2004 互联网广告电子邮件格式要求YD-T 1311-2004 防范互联网垃圾电子邮件技术要求

2019-12-01 23:24:47 0 浏览量 回答数 0

回答

详细解答可以参考官方帮助文档 阿里云任何版本的企业邮箱服务禁止发送营销邮件,营销邮件标准及相关规范,参见中国互联网协会反垃圾信息中心的管理规范。中国互联网协会电子邮件营销规范(V1.2)来源:反垃圾信息中心一、总则1.1 为规范电子邮件形式的市场营销行为,统一电子邮件营销[注1]的基本要求,为接收和发送营销内容的电子邮件提供依据,保护电子邮件用户的合法权益,根据我国相关法律法规的规定,制定本规范。1.2 本规范适用于电子邮件营销活动的开展和评价。1.3 本规范基于《互联网电子邮件服务管理办法》(中华人民共和国信息产业部令第38号)制定,从事电子邮件营销除应执行本规范外,还应符合《互联网电子邮件服务管理办法》及其他国家现行的有关标准的规定。二、基本规定2.1 中国互联网协会对电子邮件营销服务提供者[注2]实行登记备案管理。电子邮件营销服务提供者应当在开展电子邮件营销活动前将电子邮件发送服务器所使用的IP地址[注11]及相关信息向中国互联网协会反垃圾信息中心登记备案,并遵守以下规定:2.1.1需报备的 IP 地址及相关信息(1)备案单位基本情况,包括备案单位名称、备案单位地址、备案单位性质、备案单位组织机构代码、备案单位营业执照注册号、备案单位经营范围、备案单位注册资金、备案单位网站域名、备案单位法人代表姓名、备案单位联系人姓名、联系人电话、 联系人电子邮件、联系人即时通信方式等。(2)备案单位电子邮件发送服务器IP地址分配使用信息,包括备案单位用于发送电子邮件的IP地址数量、IP地址、IP地址段、IP地址所属单位名称、IP地址对应域名、IP地址对应发送营销电子邮件[注3]性质/类型(事务性邮件和商业性邮件等);(3)备案单位可自愿报备每次电子邮件营销活动的信息,包括本次营销活动使用IP地址、域名、发件人邮箱地址、电子邮件HELO[注19]信息、收件人数量、发送周期、平均发送速率[注10]、单IP最大发送速率、发送营销电子邮件性质/类型(事务性邮件和商业性邮件等)、营销电子邮件的原信/样信等。(4)其他需要备案的信息。2.1.2 电子邮件营销服务提供者拟变更电子邮件营销服务信息的,应当提前办理变更登记手续。2.1.3 电子邮件营销服务提供者提交的备案信息必须完整、真实、有效且符合我国相关法律法规规定。2.1.4 中国互联网协会反垃圾信息中心负责审核电子邮件营销服务提供者提交的备案资料,对符合要求的备案单位发放电子邮件营销备案资质证书。2.2 电子邮件营销服务提供者应当确保所有与电子邮件服务有关的域名和IP地址注册信息正确、完整和及时更新,并遵守以下规定:2.2.1 发送电子邮件的服务器IP地址必须使用静态IP[注12]地址,并已采取IP反向解析[注13]措施。2.2.2 发送电子邮件的邮箱域名建议与发送电子邮件的服务器IP反向解析的域名信息一致,并已采取SPF解析[注14]。2.2.3 建议使用DKIM[注15]、DMARC[注16]等反垃圾邮件技术,提高与电子邮件发送相关的域名和IP的信誉。2.2.4 关注知名的RBL[注17]组织列表,如果发现与电子邮件发送相关的域名、IP或邮箱地址出现在知名的RBL[注17]组织列表上,应及时采取措施进行申诉和解封。2.2.5 建议发送事务性邮件和商业性邮件的服务器分配不同的IP地址和发送邮箱地址。2.2.6 具有特殊功能的账户,如postmaster@账户(邮件管理员账户)或abuse@账户(投诉账户),必须保证其有效,并由专人负责管理维护。2.3 电子邮件营销服务提供者应当建立可靠有效的订阅[注5]及退订[注9]机制,并遵守以下规定:2.3.1未经电子邮件接收者明确许可,不得向其发送营销电子邮件。获取接收者许可的过程和内容应清楚、明确,且不违背我国的相关法律规定。电子邮件营销服务提供者应公布获取接收者许可的策略,保存接收者同意接收营销邮件的许可记录,以便在需要时向接收者提供相关信息。2.3.2营销电子邮件必须提供给接收者至少包含一种退订的途径和具体操作方法,退订信息应醒目、清晰,退订操作方法应简单,有效。2.3.3确保退订请求可以正常发送并能够被及时自动响应处理。不得强制要求用户提交退订原因或设置退订条件,退订请求发出后应在3个工作日内生效。2.4 电子邮件营销服务提供者应规范的使用和维护其营销用户[注4]的电子邮件地址列表[注6],并遵守以下规定:2.4.1 电子邮件营销服务提供者对营销用户的个人信息和电子邮件地址负有保密的义务。未经用户同意,不得泄露用户的个人信息和电子邮件地址,法律、行政法规另有规定的除外。2.4.2 电子邮件营销服务提供者应制定安全合理的隐私策略[注8]。营销用户的个人信息资料和电子邮件地址的使用应与收集目的一致,未经用户同意,不得用于收集目的以外的其它用途。2.4.3 必须保证每个电子邮件地址的取得都经过了用户的许可。尽量确保每个电子邮件地址都是真实有效的。2.4.4 应合理处理邮件投递过程中接收电子邮件的服务器返回的错误代码[注7]。对于返回代码表示不存在的电子邮件地址,应及时从发送列表中删除;对于连续出现投递错误的电子邮件地址,建议及时调整投递策略,减少可能导致错误发生的情况。2.5 电子邮件营销服务提供者应使用规范的电子邮件格式与内容,并遵守以下规定:2.5.1 营销电子邮件的内容不得违反我国相关法律法规规定。2.5.2 营销电子邮件格式应符合国际通用规范标准(参见RFC 2822)。邮件中如果包含HTML格式,应遵循由万维网联盟(W3C)公布的w3.org[注18]设计规范。2.5.3 营销电子邮件应标明邮件发送方的身份和真实的可返回的邮件发送地址。邮件的标题和信体要能准确的反映出邮件的内容、真实来源和通信目的。邮件正文应包含发送方的名称、地址、联系电话和电子邮件地址等详细信息。2.5.4 营销电子邮件的主题与内容必须相匹配。邮件内容应与营销用户的订阅内容一致。2.5.5 应采取有效的措施保护未成年人,尽可能的识别未成年的邮件订阅者。营销电子邮件含有不适合未成年人阅读的内容时,应提前核实接收者的年龄,确保接收者达到合法接收和阅读的年龄。发送给未成年人的营销邮件应征得其监护人的许可,内容符合此年龄段人群的知识水准、阅历和心里成熟程度。2.6 电子邮件营销服务提供者应与邮件接收方建立良好的沟通渠道,并参考以下规定:2.6.1 中国互联网协会反垃圾信息中心负责协助电子邮件营销服务提供者与邮件接收组织之间的沟通协调,在邮件传送过程中出现问题时,及时有效的进行沟通,确保尽快使问题得到解决。2.6.2 中国互联网协会反垃圾信息中心应协助电子邮件营销服务提供者与邮件接收组织之间建立信息反馈机制,改进电子邮件营销服务提供者的服务水平。2.6.3 中国互联网协会反垃圾信息中心应对电子邮件营销活动进行监督,对电子邮件营销服务提供者的信誉进行评价。2.6.4 电子邮件营销服务提供者应建立公平、高效、安全、易于使用的邮件投诉系统,在营销电子邮件中为营销用户提供便捷的投诉方式,受理营销用户对营销电子邮件的投诉。对被投诉的营销电子邮件,应立即开展调查,采取合理有效的防范或处理措施,并将有关情况和调查结果及时向各省通信管理局等国家有关机关或者12321网络不良和垃圾信息举报受理中心报告。2.6.5 电子邮件营销服务提供者应按照邮件接收方的要求限制营销电子邮件的发送速率。邮件接收方应将未投递成功的电子邮件服务器错误信息反馈邮件发送方。对信誉良好,行为规范的电子邮件营销服务提供者,邮件接收方可适当放宽营销电子邮件的发送速率。2.7 电子邮件营销服务提供者应积极配合各省通信管理局等国家有关机关和12321网络不良和垃圾信息举报受理中心开展调查工作。2.8 中国互联网协会拥有本规范的解释权和修改权。2.9 本规范自发布之日起施行。 附注:1. 电子邮件营销:指通过电子邮件开展的营销活动。2. 电子邮件营销服务提供者:也是营销电子邮件的发送方,指提供电子邮件营销服务的单位或个人,包括直接开展电子邮件营销活动的单位或个人以及接受委托开展电子邮件营销活动的单位或个人。3. 营销电子邮件:指具有营销功能的电子邮件。根据电子邮件的发送目的,分为事务性邮件和商业性邮件两种类型。3.1 事务性邮件,是指由收件人触发并已允许发件人发送的,以推动、完成或确认相关联流程为主要目的而发送的电子邮件。常见分类包括:(1)账号相关:账号激活、信息验证、账号绑定、密码修改、密码取回等。(2)交易信息:订单通知、付款通知、退款通知、物流通知、交易投诉等。(3)账单信息:对帐单、流水账单、催款通知、账户变更等。(4)其他类型。3.2 商业性邮件,是指任何以推销或者推广某种商品或服务(包括商业性网站的内容)为主要目的而发送的电子邮件。常见分类包括:(1)期刊资讯:更新通知、各类期刊、各类报表等。(2)产品促销:新品推广、季末促销、优惠套餐、折扣优惠、积分优惠等。(3)成员营销:好友邀请、成员关怀、主题活动、用户调研等。(4)其他类型。3.3 事务性邮件如果附带商业性内容,则视为商业性邮件。4. 营销用户:指电子邮件营销活动的对象,即接收营销电子邮件的电子邮箱使用者。5. 订阅:指营销用户预先订制,同意接收订制的营销电子邮件的行为。6. 邮件列表:指已经订阅了某一类营销电子邮件的用户电子邮箱地址列表,该列表是此类营销电子邮件的发送对象。7. 错误代码/硬退回/软退回:指在邮件的SMTP发送过程中,收信方服务器每处理完一条SMTP命令,都会向发信方服务器回传一个返回信息,用于表明对这条SMTP命令的执行结果。如返回信息以4XX(如450等)开头,指接收方临时性拒收该邮件,称软退回;如返回信息以5XX(如550等)开头,指接收方永久性拒收该邮件,称硬退回。以上列举的两类代码,习惯称为错误代码。8. 隐私策略:指电子邮件营销活动所收集的营销用户信息类型,收集方式和收集技术,以及信息的提供对象和使用用途。隐私策略中还应包括用户信息保护的安全措施、责任和实施过程。9. 退订:指营销用户取消订阅营销电子邮件的行为。10. 发送速率:指单位时间内的发送电子邮件的总数量。 常见的时间间隔单位包括:分钟、15分钟、小时、天、周、月等。11. IP地址/IP段IP地址是被用于定位互联网上的电脑一个唯一编号,地址的格式如159.226.1.1。多个IP地址的组合,即称为IP段。邮件发送过程中会?谰軮P地址,来确定邮件发送者和邮件接收者的位置。12. 静态IP地址指长期固定分配给一台计算机使用的IP地址,一般是由网络运营商分配。13. IP反向解析IP反向解析是一项常用的反垃圾邮件技术。常用的DNS服务器里面有两个区域,即“正向查找区域”和“反向查找区域”。正向查找区域是指域名解析,反向查找区域即是IP反向解析,简称PTR记录,其作用是通过查询IP地址的PTR记录来得到该IP地址指向的域名。PTR记录需要由提供IP地址的网络运营商(ISP)进行配置。14. SPFSPF(Sender Policy Framework)是一种通过IP地址来认证电子邮件发件人身份的技术,是一项非常高效的反垃圾邮件技术。它通过在DNS中发布一条TXT类型的记录,用于登记某个域名所有拥有的合法的发送邮件的所有IP地址。15. DKIMDKIM(DomainKeys Identified Mail)是一种防诈骗邮件的反垃圾邮件技术。DKIM要求邮件发送方在电子邮件的信头插入DKIM-Signature及电子签名信息,而邮件接收方则通过DNS查询得到其公钥然后进行合法性验证。16. DMARCDMARC(Domain-based Message Authentication, Reporting and Conformance)是一种防诈骗邮件的反垃圾邮件技术。DMARC结合SPF和DKIM两项技术,通过检查电子邮件信头的发件人的合法性,将诈骗邮件识别出来。17. RBLRBL(Real-time Blackhole List),即实时黑名单列表,是一些由国际知名的反垃圾邮件组织所提供的恶意发送垃圾邮件的发件人邮箱地址,IP地址,URL地址等黑名单列表的服务。若已被RBL收录,需到相应RBL官方网站上去核实并申请移除。常见的知名RBL组织,如中国互联网协会反垃圾信息中心、spamhaus,Maps,sorbs,uribl,surbl等。18. w3.org规范由万维网联盟(W3C)共同开发与公布的各种web设计规范。当邮件正文以网页的形式组织时,应当参考这些规范。19.HELO电子邮件头中邮件发送者用来标识自己的身份的命令字段。 附录:电子邮件营销常用指标1. 发送量发送的营销电子邮件数量2. 到达量发送的营销电子邮件数量-退回的营销电子邮件数量3. 到达率到达接收方邮箱的营销电子邮件数量/发送的营销电子邮件数量×100%4. 退信率退回的营销电子邮件数量/发送的营销电子邮件数量×100%5. 硬退信率硬退回的营销电子邮件数量/发送的营销电子邮件数量×100%6. 软退信率软退回的营销电子邮件数量/发送的营销电子邮件数量×100%7. 打开率打开营销电子邮件的接收方数量/收到营销电子邮件的接收方数量×100%,不计算重复打开邮件的情况。8. 点击率点击了营销电子邮件内容中链接的接收方数量/收到营销电子邮件的接收方数量×100%,不计算重复点击的情况。9. 点击打开率点击了营销电子邮件内容中链接的接收方数量/打开营销电子邮件的接收方数量×100%,不计算重复点击和重复打开的情况。10. 退订率退订营销电子邮件的接收方数量/收到营销电子邮件的接收方数量×100%11. 投诉率被投诉的营销电子邮件数量/到达接收方邮箱的营销电子邮件数量×100%12. 信誉度邮件接收方或者第三方机构对营销电子邮件服务信誉和质量的评定结果 参考中华人民共和国信息产业部令第38号 互联网电子邮件服务管理办法中国互联网协会 电子邮件服务指南(V1.1)中国互联网协会 中国互联网协会互联网公共电子邮件服务规范YD-T 1310-2004 互联网广告电子邮件格式要求YD-T 1311-2004 防范互联网垃圾电子邮件技术要求

2019-12-01 23:24:48 0 浏览量 回答数 0

问题

IIS7.5安装配置UrlScan3.1应用防火墙

虎笑 2019-12-01 21:00:19 11275 浏览量 回答数 2

问题

Web测试方法

技术小菜鸟 2019-12-01 21:41:32 7022 浏览量 回答数 1

问题

【阿里云产品公测】以开发者角度看ACE服务『ACE应用构建指南』

mr_wid 2019-12-01 21:10:06 20092 浏览量 回答数 6

回答

先说结论: 不要对接!不要对接!不要对接! 开个玩笑,以上仅代表个人观点,大家也知道这种“三体式警告”根本没有用的,我自己也研究如何对接,说不定做完后就觉得“真香”了。 为什么要对接? 首先讨论一下为什么要把 Flutter 对接到 Web 生态。 Flutter 现在是一个炙手可热的跨平台技术,能够一套代码运行在 Android、iOS、PC、IoT 以及浏览器上,被认为是下一代跨平台技术。相比于 Weex 和 React Native 可以很好地解决多平台一致性问题,原生渲染性能相近,上层没有 JS 那么厚的封装层次,整体性能会略好一些。 但是大部分兴冲冲去学 Flutter 的人疑惑的第一个问题就是:为什么 Flutter 要用 Dart?一个全新的语言意味着新的学习成本,难道 JS 不香吗?JS 不香不是还有 TypeScript 吗!事实上 Flutter 抛弃的岂止是 JS 这门语言,也抛弃了 HTML 和 CSS,设计了一套解耦得更好的 Widget 体系,Flutter 抛弃的是整个 Web,致力于打造一个新的生态,但是这个生态无法复用 Web 生态的代码和解决方案。尤其是之前所有跨平台方案 Hybrid、React Native、Weex 都是对接 Web 生态的,这让 Flutter 显得有些格格不入,也让大部分前端开发者望而却步。 下面是我整理出来的,前端开发者使用 Flutter 的各方面成本: 因为 Flutter 的开发模式和前端框架比较像(可以说就是抄的 React),所以框架的学习成本并不高,稍微高一些的是 Dart 语言的学习成本,另外还要学习如何用 Widget 组装 UI,虽然很多布局 Widget 设计得和 CSS 很像,灵活度还是差了很多。要想在真实项目中用起来,还要改造整个工具链,以“Native First”的视角做开发,开发 Flutter 和开发原生应用的链路是比较像的,和开发前端页面有较大差异。最高的还是生态成本,前端生态的积累无论是代码还是技术方案都很难复用,这是最痛的一点,生态也是 Flutter 最弱的一环。 无论是为了先进的技术理念还是出于商业私心,先不管 Flutter 为什么抛弃 Web 生态,现实问题是最大的 UI 开发者群体是前端,最丰富的生态是 Web 生态,我觉得 Web 技术也是开发 UI 最高效的方式。如果能在上层使用 Web 技术栈开发,在底层使用 Flutter 实现跨平台渲染,不是可以很好的兼顾开发效率、性能和跨平台一致性吗?还能复用 Web 技术栈大量的技术积累。 可能这些理由也不够充分,暂且先照着这个假设继续分析,最后再重新讨论到底该不该对接。 关于 Flutter 和 Web 生态的对接涉及两个方面: 从 Web 到 Flutter。就是使用 Web 技术栈来开发,然后对接到 Flutter 上实现跨平台渲染。对 Web 来说是解决性能和跨平台一致性问题,对 Flutter 来说是解决生态复用问题。从 Flutter 到 Web。就是官方已经实现的 Web support for Flutter,把已经用 Dart 开发好的 App 编译成 HTML/JS/CSS 然后运行在浏览器上,可以用于降级和外投场景。 如何实现“从 Web 到 Flutter”? 首先分析一下 Flutter 的架构图,看看可以从哪里下手。 Flutter 可以分为 Framework 和 Engine 两部分,Engine 部分比较底层也比较稳定了,最好不要动,需要改的是用 Dart 实现的 Framework。要想对接 Web 生态的话,JS 引擎肯定是要引入的,至于是否保留 Dart VM 有待讨论。图中最上面 Material 和 Cupertino 两个 UI 库前端是不需要的,前端有自己的。关键是 Widget 这部分,是替换成 HTML/CSS 的方式写 UI,还是继续保留 Widget 但是把语言换成 JS,不同方案给出的解法也不一样。 有不少方案可以实现对接,业界有挺多尝试的,我总结了下面三种方式: - TS 魔改:用 JS 引擎替换掉 Dart VM,用 JS/TS 重新实现 Flutter Framework(或者直接 dart2js 编译过来)。 - JS 对接:引入 JS 引擎同时保留 Dart VM,用前端框架对接 Flutter Framework。 - C++ 魔改:用 JS 引擎替换掉 Dart VM,用 C++ 重新实现 Flutter Framework。 TS 魔改 TS 魔改就是完全抛弃掉 Dart VM,用 TypeScript 重新实现一遍用 Dart 写的 Flutter Framework。 为啥是 TS 而不是 JS?这不是因为 TS 是个大热门嘛,而且向下兼容 JS,现在几乎所有时髦的框架都要用 TS 重写了。 这种方案的出发点是“如果能把 Flutter 的 Dart 换成 JS 就好了”,最容易想到的路就是把 Dart 翻译成 TS,或者直接用 dart2js 把代码编译成 js,但是编译出来的代码包含很多 dart:ui 之类的库的封装,生成的包也挺大的,也比较难定制需要导出的接口,不如干脆用 TS 重写一遍,工具链更熟悉一些,还可以加一些定制。 理论上讲翻译之后 Flutter 绝大部分功能都依然支持,可以复用各种 npm 包,还可以动态化,但是丧失了 AOT 能力,JS 语言的执行性能应该是不如 Dart 的。而且所有节点的布局运算都发生在 JS,底层只需要提供基础的图形能力就好了,就好像是基于 Canvas API 写了一套 UI 框架,性能未必有现存前端框架的性能高。 此外最大的问题是如何与官方 Flutter 保持一致,假如现在是从 v1.13 版本翻译过来的,以后官方升级到了 v1.15 要不要同步更新?这个过程没啥技术含量,而且需要持续投入,做起来比较恶心。 另外还需要考虑上层是用 Widget 的方式写 UI,还是用前端熟悉的 HTML+CSS。如果依然用 Widget 的话,那大部分前端组件还是用不了的,UI 还是得重写一遍。反正要重写的话,成本也没降下来,那就用 Dart 重写呗…… 直接用官方原版 Flutter 也避免每次更新都要翻译一遍 Dart 代码。所以既然选择了对接前端生态,那就要对接 CSS,不然就没有足够的价值。然而 CSS 和 Widget 的对接也是很繁琐的过程,而且存在完备性问题。 JS 对接 翻译代码的方式不够优雅,那就保留 Dart,把 JS/CSS 对接到 Widget 上面不就好了? 当然可以,这种方式是仅把 Flutter 当做了底层的渲染引擎,上层保持前端框架的写法,仅把渲染部分对接到 Flutter。现存的很多前端框架都把底层渲染能力做了抽象,可以对接到不同渲染引擎上,如 Vue/Rax 同时支持浏览器和 Weex,用同样的方式,可以再支持一个 Flutter。 这种方式对前端框架的兼容性比较好,但是链路太长了,业务代码调用前端框架接口做渲染,一顿操作之后发出了渲染指令,这个渲染指令要基于通信的方式传给 Flutter Framework,这中间涉及一次 JS 到 C++ 再到 Dart 的跨语言转换,然后再接收到渲染指令之后还要转成相应的 Widget 树,从 CSS 到 Widget 的转换依然很繁琐。而且 Widget 本身是可以带有状态的,本身就是响应式更新的,在更新时会重新生成 widget 并 diff,如果在前端更新 UI 的话,前端框架在 js 里 diff 一次 vdom,传到 Flutter 之后又 diff 一次 widget。 如果要绕过 Widget 直接对接图中的 Rendering 这一层,可以绕过 widget diff 但是得改 Flutter Framework 的渲染链路,既然要改 Flutter Framework 那为什么不直接用 TS 魔改呢,还绕过了 JS 到 Dart 的通信,又回到了第一种方案。 总结来说,这个方案的优点是:实现简单、能最大化保留前端开发体验,缺点是:渲染链路长、通信成本高、响应式逻辑冲突、CSS 转 Widget 不完备等。 C++ 魔改 想要干掉 Dart VM,就需要用其他语言重新实现用 Dart 开发的 Framework,用 JS/TS 可以,用 C++ 当然可以,最硬核的方式就是用 C++ 重新实现 Flutter 的 Framework,然后接入 JS 引擎,通过 binding 把 C++ 接口透出到 JS 环境,上层应用还是用 JS 做开发。 把 Framework 层下沉到 C++ 之后,不仅会有更好的性能,也能支持更多语言。原本 Flutter Framework 是在 Dart VM 之上的,必须依赖 Dart VM 才能运行,所以对 Dart 有强依赖;用 C++ 重新实现之后,JS 引擎是在 C++ 版 Framework 之上的,框架本身并不依赖 JS 引擎,还可以对接其他各种语言,如对接了 JVM 之后可以支持 Java 和 Kotlin,对接回 Dart VM 可以继续支持 Dart。 这个方案可以增强性能,也能保持和 Flutter 的一致性,但是改造成本和维护成本都相当高。C++ 的开发效率肯定不如 Dart,当 Flutter 快速迭代之后如何跟进是很大的问题,如果跟进不及时或者实现不一致那很可能就分化了。从 CSS 到 Widget 的转换也是不得不面对的问题。 几种方案对比 把上面几种方案画在同一张图里是这个样子的: 图中实线部分表示了跨语言的通信,太过频繁会影响性能,虚线部分表示了其他对接可能性。 从下到上,Flutter Engine 是不需要动的,这一层是跨平台的关键。Framework 则有三种语言版本,JS/TS、Dart、C++,性能是 C++ 版本最好,成本是 Dart 版本最低。然后还需要向上处理 HTML/CSS 和 Widget 的问题,可以直接对接一个前端框架,也可以直接在 C++ 层实现(不然需要透出的 binding 接口就太多了,用通信的方式也太过频繁了)。 如何实现“从 Flutter 到 Web”? 这个功能官方已经实现了,可以把使用 Dart 开发的 App 编译成 Web App 运行在浏览器上,官方文档以介绍用法和 API 为主,我这里简单分析一下内部具体的实现方案。 实现原理 结合 Flutter 的架构图来看,要实现 Web 到 Flutter 需要改造的是上层 Framework,要实现 Flutter 到 Web 需要改造的则是底层 Engine。 Framework 对 Engine 的核心依赖是 dart:ui,这是库是在 Engine 里实现的,抽象出了绘制 UI 图层的接口,底层对接 skia 的实现,向上透出 Dart 语言的接口。这样来看,对接方式就比较简单了: 使用 dart2js 把 Framework 编译成 JS 代码。基于浏览器的 API 重新实现 dart:ui,即 dart:web_ui。 把 Dart 编译成 JS 没什么问题,性能可能会有一点影响,功能都是可以完全保留的,关键是 dart:web_ui 的实现。在原生 Engine 中,dart:ui 依赖 skia 透出的 SkCanvas 实现绘制,这是一套很底层的图形接口,只定义了画线、画多边形、贴图之类的底层能力,用浏览器接口实现这一套接口还是很有挑战的。上图可以看到 Web 版 Engine 是基于 DOM 和 Canvas 实现的,底层定义了 DomCanvas 和 BitmapCanvas 两种图形接口,会把传来的 layer tree 渲染成浏览器的 Element tree,但是节点上仅包含了 position, transform, opacity 之类的样式,只用到 CSS 很小的一个子集,一些更复杂的绘制直接用 2D canvas 实现。 存在的问题 我编译了一个还算复杂的 demo 试了一下,性能很不理想,滑动不流畅,有时候图片还会闪动。生成出来的 js 代码有 1.1MB (minify 之后,未 gzip),节点层次也比较深,我评估这个页面用前端写不会超过 300KB,节点数可以少一半以上。 另外再看一下 Flutter 仓库的 issue,过滤出 platfrom-web 相关的,可以看到大量:文字编辑失效、找不到光标、ListView 在 ios 上不可滚动、checkbox/button 行为不正常、安卓滚动卡顿图片闪烁、字体失效、某些机型视频无法播放、文字选中后无法复制、无法调试…… 感觉 flutter for web 已经陷入泥潭,让人回想起前端当年处理各种浏览器兼容性的噩梦。 这些性能和兼容性问题,核心原因是浏览器未暴露足够的底层能力,以及浏览器处理手势、用户输入和方式和 Flutter 差异巨大。 实现 Flutter Engine 需要的是底层的图形接口和系统能力,虽然canvas 提供了相似的图形接口,如果全部用 canvas 实现的话很难处理可访问性、文本选择、手势、表单等问题,也会存在很多兼容性问题。所以真实方案里用的是 Canvas + DOM 混合的方式,封装层次太高了,渲染链路太长。就好像 Flutter Framework 里进行了一顿猛如虎的操作之后,节点生成好了、布局算好了、绘制属性也处理好了,就差一个画布画出来了,然后交到浏览器手里,又生成一遍 Element,再算一遍布局,在处理一遍绘制,最终才交给了底层的图形库画出来。 再比如长页面的滚动,浏览器里只要一条 CSS (overflow:scroll) 就可以让元素可滚动,手势的监听以及页面的滚动以及滚动动画都是浏览器原生实现的,不需要与 JS 交互,甚至不需要重新 layout 和 paint,只需要 compositing。如上图所示,在 Flutter 中 Animation 和 Gesture 是用 Dart 实现的,编译过来就是 JS 实现的,浏览器本身并不知道这个元素是否可滚,只是不断派发 touchmove 事件,JS 根据事件属性计算节点偏移,然后运算动画,然后把 transform 或者新的 position 作用到节点上,然后浏览器再来一遍完整的渲染流程…… 优化方案 性能和兼容性的问题还是要解决的,短期内先把 issue 解掉,长线的优化方案,官方有两种尝试: 使用 CSS Painting API 做绘制。 a, 这是还处于提案状态的新标准,可以用 JS 实现一些绘制功能,自定义 CSS 属性。 b. 目前还未实现,需要等浏览器先把 CSS Houdini 支持好。 使用 WebAssembly 版本的 Skia 做绘制 https://skia.org/user/modules/canvaskit a, 这样可以发挥 wasm 的性能优势,并且保持 skia 功能的一致。但是目前 wasm 在浏览器环境里未必有性能优势,这里不展开讨论了。 b. 已经部分实现,参考这里的配置启用功能: https://github.com/flutter/flutter/issues/41062#issuecomment-533952994 这两个方案都是想更多的利用到浏览器的底层能力,只有浏览器暴露了更多底层能力,才能更好的实现 Flutter 的 Web Engine。不过这个要等挺久的时间,我们也参与不了,现阶段想要使用 flutter for web,还是得保持现有架构,一起参与进去把 issue 解决掉,优先保障功能,其次优化性能。 一种适应性更好的架构 如果理想化一点,能不能从架构角度让 Flutter 和 Web 生态融合的更好一些呢? 回顾文章最开始的官方架构图,上面是 Framework(Dart),下面是 Engine(C++),切分在 Foundation 这一层,双方之间的交互是几何图形信息。如果还保持这个架构,把切分层次划分的更靠上一些,如下图所示,划分在 Widgets 和 Rendering 这一层,理论上讲对 Flutter 的开发者来说是无感知的,因为上层的开发语言和 Widget 接口都是不变的。 切分在这一层,Framework 和 Engine 之间的交互就不再是几何图形而是节点信息,Widget 的组合、setState 响应式更新、Widget diff 都还在 Dart 中,展开后的 RenderObject 的布局、绘制、裁剪、动画全都在 C++ 中,不仅有更好的性能,还可以与 Engine 有更好的结合。 或者说,还原本保留 Engine 的设计,把下沉的这部分逻辑上划分成 Renderer,就有了如下三层的结构: 这样划分出来的每一层都有明确的定位: Framework: 开发框架。为开发者提供可编程 API,实现响应式的开发模式,提供细粒度 Widget 供开发者自由封装和组合。Renderer: 渲染引擎。专门实现布局、绘制、动画、手势的的处理,这部分功能相对独立,是可以与开发框架解耦的,也不必与特定语言绑定。Engine: 图形引擎。实现跨平台一致的图形接口,合成输入的层并绘制到屏幕上,处理好平台力的接入和适配。 这样切分除了有性能优势以外,也使得渲染引擎摆脱了对 Dart 的依赖,能够支持多种语言,也能支持多种开发模式。对接到 Dart VM 就可以用 Dart 写代码,对接到 JS 引擎就可以用 JS 写代码,对接到 JVM 还可以写 Java,但是无论怎么写,底层的渲染能力是一样的,一套统一的布局算法,动画和手势的处理行为也是一致的。 在这样的架构下,对接 Web 生态就更容易了。Dart 和 Widget 是前端不想要的,希望能换成 JS 和 CSS,但是又想要底层的跨平台一致渲染引擎,那从 Renderer 层开始对接就好了,绕过了所有不想要的,也保留了所有想要的。 要实现 Flutter for Web 也更简单了一些。在 Engine 层做对接,一直苦于浏览器透出的底层能力不够,如果是在 Renderer 之上做对接就更容易一些,基于 JS/CSS/DOM/Canvas 的能力封装出一套 Rendering 接口,供 Widget 调用就好了,这样可以使渲染链路更短一些,但是依然要处理 Widget 和 DOM/CSS 之间的兼容性问题。 再讨论一遍:为什么要对接? 技术上已经分析完了,要想搞定 Flutter 生态和 Web 生态的对接,需要投入很大的成本,所以真正决定做之前,要先讨论清楚为什么要做对接?到底要不要做对接? 首先 Google 官方对 Flutter 的定位就是个问题。Flutter 设计之初就是不考虑 Web 生态的,甚至在刻意回避,倡导的是更贴近原生的开发方式。我之所以在开头说不要对接,原因也很简单:两种技术设计理念不同,不是朝着一个方向发展的,生态不通,技术方案不通,强行融合很可能让彼此都丧失了优势。但是业界又有很多团队在做这种尝试,说明需求是存在的,如果 Google 抵制这个方向,那就不好做了。不过现在官方已经支持了 Flutter for Web,已经向 Web 生态迈了一步,未来是否进一步与 Web 融合,也是有可能的。 另外就是跨平台技术本身的问题,浏览器发展了二三十年,已经是个很强大的跨平台产品了,几乎是 Web 的代名词了,这一点无人能敌。但是也臃肿不堪,有大量历史包袱,性能和体验不够好,和 Native 的结合度差,尤其在移动和 IoT 平台。虽然硬件性能在不断提升,但这是所有软件共享的,浏览器的性能和体验总会比 Native 差一些,差的这一些很可能就是新业务和新场景的发挥空间。观察一下近几年新诞生的业务场景,很多都是利用到了 Native 新提供的能力才火爆起来的,如 AI/AR/ 视频 / 直播 等,有因为新的 Web API 而孵化生出来的商业模式吗? 原文链接: https://mp.weixin.qq.com/s?__biz=MzAxNDEwNjk5OQ==&mid=2650405725&idx=1&sn=0b7476f7c7c01df7fdafda578f9ceb98&chksm=83953345b4e2ba53917ac30b709c07be15bd1c2fd5ae2a8ecfbb129b3813f771621b8fac95ca&scene=27#wechat_redirect

剑曼红尘 2020-03-10 09:54:40 0 浏览量 回答数 0

问题

Android SDK是什么?

nicenelly 2019-12-01 21:28:03 1794 浏览量 回答数 0

回答

92题 一般来说,建立INDEX有以下益处:提高查询效率;建立唯一索引以保证数据的唯一性;设计INDEX避免排序。 缺点,INDEX的维护有以下开销:叶节点的‘分裂’消耗;INSERT、DELETE和UPDATE操作在INDEX上的维护开销;有存储要求;其他日常维护的消耗:对恢复的影响,重组的影响。 需要建立索引的情况:为了建立分区数据库的PATITION INDEX必须建立; 为了保证数据约束性需要而建立的INDEX必须建立; 为了提高查询效率,则考虑建立(是否建立要考虑相关性能及维护开销); 考虑在使用UNION,DISTINCT,GROUP BY,ORDER BY等字句的列上加索引。 91题 作用:加快查询速度。原则:(1) 如果某属性或属性组经常出现在查询条件中,考虑为该属性或属性组建立索引;(2) 如果某个属性常作为最大值和最小值等聚集函数的参数,考虑为该属性建立索引;(3) 如果某属性经常出现在连接操作的连接条件中,考虑为该属性或属性组建立索引。 90题 快照Snapshot是一个文件系统在特定时间里的镜像,对于在线实时数据备份非常有用。快照对于拥有不能停止的应用或具有常打开文件的文件系统的备份非常重要。对于只能提供一个非常短的备份时间而言,快照能保证系统的完整性。 89题 游标用于定位结果集的行,通过判断全局变量@@FETCH_STATUS可以判断是否到了最后,通常此变量不等于0表示出错或到了最后。 88题 事前触发器运行于触发事件发生之前,而事后触发器运行于触发事件发生之后。通常事前触发器可以获取事件之前和新的字段值。语句级触发器可以在语句执行前或后执行,而行级触发在触发器所影响的每一行触发一次。 87题 MySQL可以使用多个字段同时建立一个索引,叫做联合索引。在联合索引中,如果想要命中索引,需要按照建立索引时的字段顺序挨个使用,否则无法命中索引。具体原因为:MySQL使用索引时需要索引有序,假设现在建立了"name,age,school"的联合索引,那么索引的排序为: 先按照name排序,如果name相同,则按照age排序,如果age的值也相等,则按照school进行排序。因此在建立联合索引的时候应该注意索引列的顺序,一般情况下,将查询需求频繁或者字段选择性高的列放在前面。此外可以根据特例的查询或者表结构进行单独的调整。 86题 建立索引的时候一般要考虑到字段的使用频率,经常作为条件进行查询的字段比较适合。如果需要建立联合索引的话,还需要考虑联合索引中的顺序。此外也要考虑其他方面,比如防止过多的所有对表造成太大的压力。这些都和实际的表结构以及查询方式有关。 85题 存储过程是一组Transact-SQL语句,在一次编译后可以执行多次。因为不必重新编译Transact-SQL语句,所以执行存储过程可以提高性能。触发器是一种特殊类型的存储过程,不由用户直接调用。创建触发器时会对其进行定义,以便在对特定表或列作特定类型的数据修改时执行。 84题 存储过程是用户定义的一系列SQL语句的集合,涉及特定表或其它对象的任务,用户可以调用存储过程,而函数通常是数据库已定义的方法,它接收参数并返回某种类型的值并且不涉及特定用户表。 83题 减少表连接,减少复杂 SQL,拆分成简单SQL。减少排序:非必要不排序,利用索引排序,减少参与排序的记录数。尽量避免 select *。尽量用 join 代替子查询。尽量少使用 or,使用 in 或者 union(union all) 代替。尽量用 union all 代替 union。尽量早的将无用数据过滤:选择更优的索引,先分页再Join…。避免类型转换:索引失效。优先优化高并发的 SQL,而不是执行频率低某些“大”SQL。从全局出发优化,而不是片面调整。尽可能对每一条SQL进行 explain。 82题 如果条件中有or,即使其中有条件带索引也不会使用(要想使用or,又想让索引生效,只能将or条件中的每个列都加上索引)。对于多列索引,不是使用的第一部分,则不会使用索引。like查询是以%开头。如果列类型是字符串,那一定要在条件中将数据使用引号引用起来,否则不使用索引。如果mysql估计使用全表扫描要比使用索引快,则不使用索引。例如,使用<>、not in 、not exist,对于这三种情况大多数情况下认为结果集很大,MySQL就有可能不使用索引。 81题 主键不能重复,不能为空,唯一键不能重复,可以为空。建立主键的目的是让外键来引用。一个表最多只有一个主键,但可以有很多唯一键。 80题 空值('')是不占用空间的,判断空字符用=''或者<>''来进行处理。NULL值是未知的,且占用空间,不走索引;判断 NULL 用 IS NULL 或者 is not null ,SQL 语句函数中可以使用 ifnull ()函数来进行处理。无法比较 NULL 和 0;它们是不等价的。无法使用比较运算符来测试 NULL 值,比如 =, <, 或者 <>。NULL 值可以使用 <=> 符号进行比较,该符号与等号作用相似,但对NULL有意义。进行 count ()统计某列的记录数的时候,如果采用的 NULL 值,会被系统自动忽略掉,但是空值是统计到其中。 79题 HEAP表是访问数据速度最快的MySQL表,他使用保存在内存中的散列索引。一旦服务器重启,所有heap表数据丢失。BLOB或TEXT字段是不允许的。只能使用比较运算符=,<,>,=>,= <。HEAP表不支持AUTO_INCREMENT。索引不可为NULL。 78题 如果想输入字符为十六进制数字,可以输入带有单引号的十六进制数字和前缀(X),或者只用(Ox)前缀输入十六进制数字。如果表达式上下文是字符串,则十六进制数字串将自动转换为字符串。 77题 Mysql服务器通过权限表来控制用户对数据库的访问,权限表存放在mysql数据库里,由mysql_install_db脚本初始化。这些权限表分别user,db,table_priv,columns_priv和host。 76题 在缺省模式下,MYSQL是autocommit模式的,所有的数据库更新操作都会即时提交,所以在缺省情况下,mysql是不支持事务的。但是如果你的MYSQL表类型是使用InnoDB Tables 或 BDB tables的话,你的MYSQL就可以使用事务处理,使用SET AUTOCOMMIT=0就可以使MYSQL允许在非autocommit模式,在非autocommit模式下,你必须使用COMMIT来提交你的更改,或者用ROLLBACK来回滚你的更改。 75题 它会停止递增,任何进一步的插入都将产生错误,因为密钥已被使用。 74题 创建索引的时候尽量使用唯一性大的列来创建索引,由于使用b+tree做为索引,以innodb为例,一个树节点的大小由“innodb_page_size”,为了减少树的高度,同时让一个节点能存放更多的值,索引列尽量在整数类型上创建,如果必须使用字符类型,也应该使用长度较少的字符类型。 73题 当MySQL单表记录数过大时,数据库的CRUD性能会明显下降,一些常见的优化措施如下: 限定数据的范围: 务必禁止不带任何限制数据范围条件的查询语句。比如:我们当用户在查询订单历史的时候,我们可以控制在一个月的范围内。读/写分离: 经典的数据库拆分方案,主库负责写,从库负责读。垂直分区: 根据数据库里面数据表的相关性进行拆分。简单来说垂直拆分是指数据表列的拆分,把一张列比较多的表拆分为多张表。水平分区: 保持数据表结构不变,通过某种策略存储数据分片。这样每一片数据分散到不同的表或者库中,达到了分布式的目的。水平拆分可以支撑非常大的数据量。 72题 乐观锁失败后会抛出ObjectOptimisticLockingFailureException,那么我们就针对这块考虑一下重试,自定义一个注解,用于做切面。针对注解进行切面,设置最大重试次数n,然后超过n次后就不再重试。 71题 一致性非锁定读讲的是一条记录被加了X锁其他事务仍然可以读而不被阻塞,是通过innodb的行多版本实现的,行多版本并不是实际存储多个版本记录而是通过undo实现(undo日志用来记录数据修改前的版本,回滚时会用到,用来保证事务的原子性)。一致性锁定读讲的是我可以通过SELECT语句显式地给一条记录加X锁从而保证特定应用场景下的数据一致性。 70题 数据库引擎:尤其是mysql数据库只有是InnoDB引擎的时候事物才能生效。 show engines 查看数据库默认引擎;SHOW TABLE STATUS from 数据库名字 where Name='表名' 如下;SHOW TABLE STATUS from rrz where Name='rrz_cust';修改表的引擎alter table table_name engine=innodb。 69题 如果是等值查询,那么哈希索引明显有绝对优势,因为只需要经过一次算法即可找到相应的键值;当然了,这个前提是,键值都是唯一的。如果键值不是唯一的,就需要先找到该键所在位置,然后再根据链表往后扫描,直到找到相应的数据;如果是范围查询检索,这时候哈希索引就毫无用武之地了,因为原先是有序的键值,经过哈希算法后,有可能变成不连续的了,就没办法再利用索引完成范围查询检索;同理,哈希索引也没办法利用索引完成排序,以及like ‘xxx%’ 这样的部分模糊查询(这种部分模糊查询,其实本质上也是范围查询);哈希索引也不支持多列联合索引的最左匹配规则;B+树索引的关键字检索效率比较平均,不像B树那样波动幅度大,在有大量重复键值情况下,哈希索引的效率也是极低的,因为存在所谓的哈希碰撞问题。 68题 decimal精度比float高,数据处理比float简单,一般优先考虑,但float存储的数据范围大,所以范围大的数据就只能用它了,但要注意一些处理细节,因为不精确可能会与自己想的不一致,也常有关于float 出错的问题。 67题 datetime、timestamp精确度都是秒,datetime与时区无关,存储的范围广(1001-9999),timestamp与时区有关,存储的范围小(1970-2038)。 66题 Char使用固定长度的空间进行存储,char(4)存储4个字符,根据编码方式的不同占用不同的字节,gbk编码方式,不论是中文还是英文,每个字符占用2个字节的空间,utf8编码方式,每个字符占用3个字节的空间。Varchar保存可变长度的字符串,使用额外的一个或两个字节存储字符串长度,varchar(10),除了需要存储10个字符,还需要1个字节存储长度信息(10),超过255的长度需要2个字节来存储。char和varchar后面如果有空格,char会自动去掉空格后存储,varchar虽然不会去掉空格,但在进行字符串比较时,会去掉空格进行比较。Varbinary保存变长的字符串,后面不会补\0。 65题 首先分析语句,看看是否load了额外的数据,可能是查询了多余的行并且抛弃掉了,可能是加载了许多结果中并不需要的列,对语句进行分析以及重写。分析语句的执行计划,然后获得其使用索引的情况,之后修改语句或者修改索引,使得语句可以尽可能的命中索引。如果对语句的优化已经无法进行,可以考虑表中的数据量是否太大,如果是的话可以进行横向或者纵向的分表。 64题 建立索引的时候一般要考虑到字段的使用频率,经常作为条件进行查询的字段比较适合。如果需要建立联合索引的话,还需要考虑联合索引中的顺序。此外也要考虑其他方面,比如防止过多的所有对表造成太大的压力。这些都和实际的表结构以及查询方式有关。 63题 存储过程是一些预编译的SQL语句。1、更加直白的理解:存储过程可以说是一个记录集,它是由一些T-SQL语句组成的代码块,这些T-SQL语句代码像一个方法一样实现一些功能(对单表或多表的增删改查),然后再给这个代码块取一个名字,在用到这个功能的时候调用他就行了。2、存储过程是一个预编译的代码块,执行效率比较高,一个存储过程替代大量T_SQL语句 ,可以降低网络通信量,提高通信速率,可以一定程度上确保数据安全。 62题 密码散列、盐、用户身份证号等固定长度的字符串应该使用char而不是varchar来存储,这样可以节省空间且提高检索效率。 61题 推荐使用自增ID,不要使用UUID。因为在InnoDB存储引擎中,主键索引是作为聚簇索引存在的,也就是说,主键索引的B+树叶子节点上存储了主键索引以及全部的数据(按照顺序),如果主键索引是自增ID,那么只需要不断向后排列即可,如果是UUID,由于到来的ID与原来的大小不确定,会造成非常多的数据插入,数据移动,然后导致产生很多的内存碎片,进而造成插入性能的下降。总之,在数据量大一些的情况下,用自增主键性能会好一些。 60题 char是一个定长字段,假如申请了char(10)的空间,那么无论实际存储多少内容。该字段都占用10个字符,而varchar是变长的,也就是说申请的只是最大长度,占用的空间为实际字符长度+1,最后一个字符存储使用了多长的空间。在检索效率上来讲,char > varchar,因此在使用中,如果确定某个字段的值的长度,可以使用char,否则应该尽量使用varchar。例如存储用户MD5加密后的密码,则应该使用char。 59题 一. read uncommitted(读取未提交数据) 即便是事务没有commit,但是我们仍然能读到未提交的数据,这是所有隔离级别中最低的一种。 二. read committed(可以读取其他事务提交的数据)---大多数数据库默认的隔离级别 当前会话只能读取到其他事务提交的数据,未提交的数据读不到。 三. repeatable read(可重读)---MySQL默认的隔离级别 当前会话可以重复读,就是每次读取的结果集都相同,而不管其他事务有没有提交。 四. serializable(串行化) 其他会话对该表的写操作将被挂起。可以看到,这是隔离级别中最严格的,但是这样做势必对性能造成影响。所以在实际的选用上,我们要根据当前具体的情况选用合适的。 58题 B+树的高度一般为2-4层,所以查找记录时最多只需要2-4次IO,相对二叉平衡树已经大大降低了。范围查找时,能通过叶子节点的指针获取数据。例如查找大于等于3的数据,当在叶子节点中查到3时,通过3的尾指针便能获取所有数据,而不需要再像二叉树一样再获取到3的父节点。 57题 因为事务在修改页时,要先记 undo,在记 undo 之前要记 undo 的 redo, 然后修改数据页,再记数据页修改的 redo。 Redo(里面包括 undo 的修改) 一定要比数据页先持久化到磁盘。 当事务需要回滚时,因为有 undo,可以把数据页回滚到前镜像的状态,崩溃恢复时,如果 redo log 中事务没有对应的 commit 记录,那么需要用 undo把该事务的修改回滚到事务开始之前。 如果有 commit 记录,就用 redo 前滚到该事务完成时并提交掉。 56题 redo log是物理日志,记录的是"在某个数据页上做了什么修改"。 binlog是逻辑日志,记录的是这个语句的原始逻辑,比如"给ID=2这一行的c字段加1"。 redo log是InnoDB引擎特有的;binlog是MySQL的Server层实现的,所有引擎都可以使用。 redo log是循环写的,空间固定会用完:binlog 是可以追加写入的。"追加写"是指binlog文件写到一定大小后会切换到下一个,并不会覆盖以前的日志。 最开始 MySQL 里并没有 InnoDB 引擎,MySQL 自带的引擎是 MyISAM,但是 MyISAM 没有 crash-safe 的能力,binlog日志只能用于归档。而InnoDB 是另一个公司以插件形式引入 MySQL 的,既然只依靠 binlog 是没有 crash-safe 能力的,所以 InnoDB 使用另外一套日志系统,也就是 redo log 来实现 crash-safe 能力。 55题 重做日志(redo log)      作用:确保事务的持久性,防止在发生故障,脏页未写入磁盘。重启数据库会进行redo log执行重做,达到事务一致性。 回滚日志(undo log)  作用:保证数据的原子性,保存了事务发生之前的数据的一个版本,可以用于回滚,同时可以提供多版本并发控制下的读(MVCC),也即非锁定读。 二进 制日志(binlog)    作用:用于主从复制,实现主从同步;用于数据库的基于时间点的还原。 错误日志(errorlog) 作用:Mysql本身启动,停止,运行期间发生的错误信息。 慢查询日志(slow query log)  作用:记录执行时间过长的sql,时间阈值可以配置,只记录执行成功。 一般查询日志(general log)    作用:记录数据库的操作明细,默认关闭,开启后会降低数据库性能 。 中继日志(relay log) 作用:用于数据库主从同步,将主库发来的bin log保存在本地,然后从库进行回放。 54题 MySQL有三种锁的级别:页级、表级、行级。 表级锁:开销小,加锁快;不会出现死锁;锁定粒度大,发生锁冲突的概率最高,并发度最低。 行级锁:开销大,加锁慢;会出现死锁;锁定粒度最小,发生锁冲突的概率最低,并发度也最高。 页面锁:开销和加锁时间界于表锁和行锁之间;会出现死锁;锁定粒度界于表锁和行锁之间,并发度一般。 死锁: 是指两个或两个以上的进程在执行过程中。因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去。 死锁的关键在于:两个(或以上)的Session加锁的顺序不一致。 那么对应的解决死锁问题的关键就是:让不同的session加锁有次序。死锁的解决办法:1.查出的线程杀死。2.设置锁的超时时间。3.指定获取锁的顺序。 53题 当多个用户并发地存取数据时,在数据库中就会产生多个事务同时存取同一数据的情况。若对并发操作不加控制就可能会读取和存储不正确的数据,破坏数据库的一致性(脏读,不可重复读,幻读等),可能产生死锁。 乐观锁:乐观锁不是数据库自带的,需要我们自己去实现。 悲观锁:在进行每次操作时都要通过获取锁才能进行对相同数据的操作。 共享锁:加了共享锁的数据对象可以被其他事务读取,但不能修改。 排他锁:当数据对象被加上排它锁时,一个事务必须得到锁才能对该数据对象进行访问,一直到事务结束锁才被释放。 行锁:就是给某一条记录加上锁。 52题 Mysql是关系型数据库,MongoDB是非关系型数据库,数据存储结构的不同。 51题 关系型数据库优点:1.保持数据的一致性(事务处理)。 2.由于以标准化为前提,数据更新的开销很小。 3. 可以进行Join等复杂查询。 缺点:1、为了维护一致性所付出的巨大代价就是其读写性能比较差。 2、固定的表结构。 3、高并发读写需求。 4、海量数据的高效率读写。 非关系型数据库优点:1、无需经过sql层的解析,读写性能很高。 2、基于键值对,数据没有耦合性,容易扩展。 3、存储数据的格式:nosql的存储格式是key,value形式、文档形式、图片形式等等,文档形式、图片形式等等,而关系型数据库则只支持基础类型。 缺点:1、不提供sql支持,学习和使用成本较高。 2、无事务处理,附加功能bi和报表等支持也不好。 redis与mongoDB的区别: 性能:TPS方面redis要大于mongodb。 可操作性:mongodb支持丰富的数据表达,索引,redis较少的网络IO次数。 可用性:MongoDB优于Redis。 一致性:redis事务支持比较弱,mongoDB不支持事务。 数据分析:mongoDB内置了数据分析的功能(mapreduce)。 应用场景:redis数据量较小的更性能操作和运算上,MongoDB主要解决海量数据的访问效率问题。 50题 如果Redis被当做缓存使用,使用一致性哈希实现动态扩容缩容。如果Redis被当做一个持久化存储使用,必须使用固定的keys-to-nodes映射关系,节点的数量一旦确定不能变化。否则的话(即Redis节点需要动态变化的情况),必须使用可以在运行时进行数据再平衡的一套系统,而当前只有Redis集群可以做到这样。 49题 分区可以让Redis管理更大的内存,Redis将可以使用所有机器的内存。如果没有分区,你最多只能使用一台机器的内存。分区使Redis的计算能力通过简单地增加计算机得到成倍提升,Redis的网络带宽也会随着计算机和网卡的增加而成倍增长。 48题 除了缓存服务器自带的缓存失效策略之外(Redis默认的有6种策略可供选择),我们还可以根据具体的业务需求进行自定义的缓存淘汰,常见的策略有两种: 1.定时去清理过期的缓存; 2.当有用户请求过来时,再判断这个请求所用到的缓存是否过期,过期的话就去底层系统得到新数据并更新缓存。 两者各有优劣,第一种的缺点是维护大量缓存的key是比较麻烦的,第二种的缺点就是每次用户请求过来都要判断缓存失效,逻辑相对比较复杂!具体用哪种方案,可以根据应用场景来权衡。 47题 Redis提供了两种方式来作消息队列: 一个是使用生产者消费模式模式:会让一个或者多个客户端监听消息队列,一旦消息到达,消费者马上消费,谁先抢到算谁的,如果队列里没有消息,则消费者继续监听 。另一个就是发布订阅者模式:也是一个或多个客户端订阅消息频道,只要发布者发布消息,所有订阅者都能收到消息,订阅者都是平等的。 46题 Redis的数据结构列表(list)可以实现延时队列,可以通过队列和栈来实现。blpop/brpop来替换lpop/rpop,blpop/brpop阻塞读在队列没有数据的时候,会立即进入休眠状态,一旦数据到来,则立刻醒过来。Redis的有序集合(zset)可以用于实现延时队列,消息作为value,时间作为score。Zrem 命令用于移除有序集中的一个或多个成员,不存在的成员将被忽略。当 key 存在但不是有序集类型时,返回一个错误。 45题 1.热点数据缓存:因为Redis 访问速度块、支持的数据类型比较丰富。 2.限时业务:expire 命令设置 key 的生存时间,到时间后自动删除 key。 3.计数器:incrby 命令可以实现原子性的递增。 4.排行榜:借助 SortedSet 进行热点数据的排序。 5.分布式锁:利用 Redis 的 setnx 命令进行。 6.队列机制:有 list push 和 list pop 这样的命令。 44题 一致哈希 是一种特殊的哈希算法。在使用一致哈希算法后,哈希表槽位数(大小)的改变平均只需要对 K/n 个关键字重新映射,其中K是关键字的数量, n是槽位数量。然而在传统的哈希表中,添加或删除一个槽位的几乎需要对所有关键字进行重新映射。 43题 RDB的优点:适合做冷备份;读写服务影响小,reids可以保持高性能;重启和恢复redis进程,更加快速。RDB的缺点:宕机会丢失最近5分钟的数据;文件特别大时可能会暂停数毫秒,或者甚至数秒。 AOF的优点:每个一秒执行fsync操作,最多丢失1秒钟的数据;以append-only模式写入,没有任何磁盘寻址的开销;文件过大时,不会影响客户端读写;适合做灾难性的误删除的紧急恢复。AOF的缺点:AOF日志文件比RDB数据快照文件更大,支持写QPS比RDB支持的写QPS低;比RDB脆弱,容易有bug。 42题 对于Redis而言,命令的原子性指的是:一个操作的不可以再分,操作要么执行,要么不执行。Redis的操作之所以是原子性的,是因为Redis是单线程的。而在程序中执行多个Redis命令并非是原子性的,这也和普通数据库的表现是一样的,可以用incr或者使用Redis的事务,或者使用Redis+Lua的方式实现。对Redis来说,执行get、set以及eval等API,都是一个一个的任务,这些任务都会由Redis的线程去负责执行,任务要么执行成功,要么执行失败,这就是Redis的命令是原子性的原因。 41题 (1)twemproxy,使用方式简单(相对redis只需修改连接端口),对旧项目扩展的首选。(2)codis,目前用的最多的集群方案,基本和twemproxy一致的效果,但它支持在节点数改变情况下,旧节点数据可恢复到新hash节点。(3)redis cluster3.0自带的集群,特点在于他的分布式算法不是一致性hash,而是hash槽的概念,以及自身支持节点设置从节点。(4)在业务代码层实现,起几个毫无关联的redis实例,在代码层,对key进行hash计算,然后去对应的redis实例操作数据。这种方式对hash层代码要求比较高,考虑部分包括,节点失效后的代替算法方案,数据震荡后的自动脚本恢复,实例的监控,等等。 40题 (1) Master最好不要做任何持久化工作,如RDB内存快照和AOF日志文件 (2) 如果数据比较重要,某个Slave开启AOF备份数据,策略设置为每秒同步一次 (3) 为了主从复制的速度和连接的稳定性,Master和Slave最好在同一个局域网内 (4) 尽量避免在压力很大的主库上增加从库 (5) 主从复制不要用图状结构,用单向链表结构更为稳定,即:Master <- Slave1 <- Slave2 <- Slave3...这样的结构方便解决单点故障问题,实现Slave对Master的替换。如果Master挂了,可以立刻启用Slave1做Master,其他不变。 39题 比如订单管理,热数据:3个月内的订单数据,查询实时性较高;温数据:3个月 ~ 12个月前的订单数据,查询频率不高;冷数据:1年前的订单数据,几乎不会查询,只有偶尔的查询需求。热数据使用mysql进行存储,需要分库分表;温数据可以存储在ES中,利用搜索引擎的特性基本上也可以做到比较快的查询;冷数据可以存放到Hive中。从存储形式来说,一般情况冷数据存储在磁带、光盘,热数据一般存放在SSD中,存取速度快,而温数据可以存放在7200转的硬盘。 38题 当访问量剧增、服务出现问题(如响应时间慢或不响应)或非核心服务影响到核心流程的性能时,仍然需要保证服务还是可用的,即使是有损服务。系统可以根据一些关键数据进行自动降级,也可以配置开关实现人工降级。降级的最终目的是保证核心服务可用,即使是有损的。而且有些服务是无法降级的(如加入购物车、结算)。 37题 分层架构设计,有一条准则:站点层、服务层要做到无数据无状态,这样才能任意的加节点水平扩展,数据和状态尽量存储到后端的数据存储服务,例如数据库服务或者缓存服务。显然进程内缓存违背了这一原则。 36题 更新数据的时候,根据数据的唯一标识,将操作路由之后,发送到一个 jvm 内部队列中。读取数据的时候,如果发现数据不在缓存中,那么将重新读取数据+更新缓存的操作,根据唯一标识路由之后,也发送同一个 jvm 内部队列中。一个队列对应一个工作线程,每个工作线程串行拿到对应的操作,然后一条一条的执行。 35题 redis分布式锁加锁过程:通过setnx向特定的key写入一个随机值,并同时设置失效时间,写值成功既加锁成功;redis分布式锁解锁过程:匹配随机值,删除redis上的特点key数据,要保证获取数据、判断一致以及删除数据三个操作是原子的,为保证原子性一般使用lua脚本实现;在此基础上进一步优化的话,考虑使用心跳检测对锁的有效期进行续期,同时基于redis的发布订阅优雅的实现阻塞式加锁。 34题 volatile-lru:当内存不足以容纳写入数据时,从已设置过期时间的数据集中挑选最近最少使用的数据淘汰。 volatile-ttl:当内存不足以容纳写入数据时,从已设置过期时间的数据集中挑选将要过期的数据淘汰。 volatile-random:当内存不足以容纳写入数据时,从已设置过期时间的数据集中任意选择数据淘汰。 allkeys-lru:当内存不足以容纳写入数据时,从数据集中挑选最近最少使用的数据淘汰。 allkeys-random:当内存不足以容纳写入数据时,从数据集中任意选择数据淘汰。 noeviction:禁止驱逐数据,当内存使用达到阈值的时候,所有引起申请内存的命令会报错。 33题 定时过期:每个设置过期时间的key都需要创建一个定时器,到过期时间就会立即清除。该策略可以立即清除过期的数据,对内存很友好;但是会占用大量的CPU资源去处理过期的数据,从而影响缓存的响应时间和吞吐量。 惰性过期:只有当访问一个key时,才会判断该key是否已过期,过期则清除。该策略可以最大化地节省CPU资源,却对内存非常不友好。极端情况可能出现大量的过期key没有再次被访问,从而不会被清除,占用大量内存。 定期过期:每隔一定的时间,会扫描一定数量的数据库的expires字典中一定数量的key,并清除其中已过期的key。该策略是前两者的一个折中方案。通过调整定时扫描的时间间隔和每次扫描的限定耗时,可以在不同情况下使得CPU和内存资源达到最优的平衡效果。 32题 缓存击穿,一个存在的key,在缓存过期的一刻,同时有大量的请求,这些请求都会击穿到DB,造成瞬时DB请求量大、压力骤增。如何避免:在访问key之前,采用SETNX(set if not exists)来设置另一个短期key来锁住当前key的访问,访问结束再删除该短期key。 31题 缓存雪崩,是指在某一个时间段,缓存集中过期失效。大量的key设置了相同的过期时间,导致在缓存在同一时刻全部失效,造成瞬时DB请求量大、压力骤增,引起雪崩。而缓存服务器某个节点宕机或断网,对数据库服务器造成的压力是不可预知的,很有可能瞬间就把数据库压垮。如何避免:1.redis高可用,搭建redis集群。2.限流降级,在缓存失效后,通过加锁或者队列来控制读数据库写缓存的线程数量。3.数据预热,在即将发生大并发访问前手动触发加载缓存不同的key,设置不同的过期时间。 30题 缓存穿透,是指查询一个数据库一定不存在的数据。正常的使用缓存流程大致是,数据查询先进行缓存查询,如果key不存在或者key已经过期,再对数据库进行查询,并把查询到的对象,放进缓存。如果数据库查询对象为空,则不放进缓存。一些恶意的请求会故意查询不存在的 key,请求量很大,对数据库造成压力,甚至压垮数据库。 如何避免:1:对查询结果为空的情况也进行缓存,缓存时间设置短一点,或者该 key 对应的数据 insert 了之后清理缓存。2:对一定不存在的 key 进行过滤。可以把所有的可能存在的 key 放到一个大的 Bitmap 中,查询时通过该 bitmap 过滤。 29题 1.memcached 所有的值均是简单的字符串,redis 作为其替代者,支持更为丰富的数据类型。 2.redis 的速度比 memcached 快很多。 3.redis 可以持久化其数据。 4.Redis支持数据的备份,即master-slave模式的数据备份。 5.Redis采用VM机制。 6.value大小:redis最大可以达到1GB,而memcache只有1MB。 28题 Spring Boot 推荐使用 Java 配置而非 XML 配置,但是 Spring Boot 中也可以使用 XML 配置,通过spring提供的@ImportResource来加载xml配置。例如:@ImportResource({"classpath:some-context.xml","classpath:another-context.xml"}) 27题 Spring像一个大家族,有众多衍生产品例如Spring Boot,Spring Security等等,但他们的基础都是Spring的IOC和AOP,IOC提供了依赖注入的容器,而AOP解决了面向切面的编程,然后在此两者的基础上实现了其他衍生产品的高级功能。Spring MVC是基于Servlet的一个MVC框架,主要解决WEB开发的问题,因为 Spring的配置非常复杂,各种xml,properties处理起来比较繁琐。Spring Boot遵循约定优于配置,极大降低了Spring使用门槛,又有着Spring原本灵活强大的功能。总结:Spring MVC和Spring Boot都属于Spring,Spring MVC是基于Spring的一个MVC框架,而Spring Boot是基于Spring的一套快速开发整合包。 26题 YAML 是 "YAML Ain't a Markup Language"(YAML 不是一种标记语言)的递归缩写。YAML 的配置文件后缀为 .yml,是一种人类可读的数据序列化语言,可以简单表达清单、散列表,标量等数据形态。它通常用于配置文件,与属性文件相比,YAML文件就更加结构化,而且更少混淆。可以看出YAML具有分层配置数据。 25题 Spring Boot有3种热部署方式: 1.使用springloaded配置pom.xml文件,使用mvn spring-boot:run启动。 2.使用springloaded本地加载启动,配置jvm参数-javaagent:<jar包地址> -noverify。 3.使用devtools工具包,操作简单,但是每次需要重新部署。 用

游客ih62co2qqq5ww 2020-03-27 23:56:48 0 浏览量 回答数 0

回答

新地址 24题 Starters可以理解为启动器,它包含了一系列可以集成到应用里面的依赖包,你可以一站式集成 Spring 及其他技术,而不需要到处找示例代码和依赖包。如你想使用 Spring JPA 访问数据库,只要加入 spring-boot-starter-data-jpa 启动器依赖就能使用了。Starters包含了许多项目中需要用到的依赖,它们能快速持续的运行,都是一系列得到支持的管理传递性依赖。 23题 Spring Boot 的核心配置文件是application(.yml 或者 .properties) 和 bootstrap(.yml 或者 .properties) 配置文件。boostrap 由父 ApplicationContext 加载,比 applicaton 优先加载,boostrap 里面的属性不能被覆盖。application 配置文件主要用于 Spring Boot 项目的自动化配置。bootstrap 配置文件的应用场景:使用 Spring Cloud Config 配置中心时,这时需要在 bootstrap 配置文件中添加连接到配置中心的配置属性来加载外部配置中心的配置信息;一些固定的不能被覆盖的属性;一些加密/解密的场景。 22题 优点:快速构建项目;对主流开发框架的无配置集成;starters自动依赖与版本控制;大量的自动配置,简化开发,也可修改默认值;无需配置XML,无代码生成,开箱即用;项目可独立运行,无须外部依赖Servlet容器;提供运行时的应用监控;与云计算的天然集成。缺点:集成度较高,使用过程中不太容易了解底层。 21题 Spring Boot的初衷就是为了简化spring的配置,使得开发中集成新功能时更快,简化或减少相关的配置文件。Spring Boot其实是一个整合很多可插拔的组件(框架),内嵌了使用工具(比如内嵌了Tomcat、Jetty等),方便开发人员快速搭建和开发的一个框架。 20题 当程序创建对象、数组等引用类型实体时,系统会在堆内存中为之分配一块内存区,对象就保存在内存区中,不需要显式的去释放一个对象的内存,而是由虚拟机自行执行。在JVM 中,有一个垃圾回收线程,它是低优先级的,在正常情况下是不会执行的,只有在虚拟机空闲或者当前堆内存不足时,才会触发执行,标记那些没有被任何引用的对象,并将它们添加到要回收的集合中,进行回收。 19题 HashMap线程不安全,HashTable线程安全。HashMap允许有一个key为null,多个value为null;而HashTable不允许key和vale为null。继承类不一样,HashMap继承的是AbstractMap,HashTable继承的是Dictionary。初始容量不一样。使用的hashcode不一样。内部遍历方式的实现不一样。 18题 作用:内容可见性和禁止指令重排。内存可见性:某线程对 volatile 变量的修改,对其他线程都是可见的,即获取 volatile 变量的值都是最新的;禁止指令重排:重排序在单线程下一定能保证结果的正确性,但是在多线程环境下,可能发生重排序影响结果,若用volatile修饰共享变量,在编译时,会在指令序列中插入内存屏障来禁止特定类型的处理器重排序。使用:当一个线程需要立刻读取到另外一个线程修改的变量值的时候,我们就可以使用volatile。区别:volatile是变量修饰符,而synchronized则作用于一段代码或者方法;volatile只是在线程内存和main memory(主内存)间同步某个变量的值,而synchronized通过锁定和解锁某个监视器同步所有变量的值。显然synchronized要比volatile消耗更多资源;synchronized 关键字可以保证变量原子性和可见性,volatile 不能保证原子性。 17题 非公平主要表现在获取锁的行为上,并非是按照申请锁的时间前后给等待线程分配锁的 ,每当锁被释放后 ,任何一个线程都有机会竞争到锁,这样做的目的是为了提高执行性能 ,缺点是可能会产生线程饥饿现象 。 16题 如果线程遇到了 IO 阻塞,无能为力,因为IO是操作系统实现的,Java代码并没有办法直接接触到操作系统。如果线程因为调用 wait()、sleep()、或者 join()方法而导致的阻塞,可以中断线程,并且通过抛出 InterruptedException 来唤醒它。 15题 原子操作就是无法被别的线程打断的操作。要么不执行,要么就执行成功。在Java中可以通过锁和循环CAS的方式来实现原子操作。从JDK 1.5开始提供了java.util.concurrent.atomic包,这个包中的原子操作类提供了一种用法简单、性能高效、线程安全地更新一个变量的方式。 14题 wait()是Object类的方法,所以每一个对象能使用wait()方法。sleep()是Thread类中的静态方法。sleep不会释放锁,但会让出cpu,sleep会在指定的休眠时间后自动唤醒。wait则会释放锁,让出系统资源,并且加入wait set中,wait不会自动唤醒,而需要notify()或者notifyAll()唤醒。sleep和wait都可以被中断,使用sleep需要捕获异常。wait与notify、notifyAll只能在同步代码块中使用,而sleep可以在任何地方使用。 13题 Synchronized 是由 JVM 实现的一种实现互斥同步的一种方式,查看编译后的字节码,会发现被 Synchronized 修饰过的程序块,在编译前后被编译器生成了monitorenter 和 monitorexit 两个字节码指令。在虚拟机执行到 monitorenter 指令时,首先要尝试获取对象的锁:如果这个对象没有锁定,或者当前线程已经拥有了这个对象的锁,把锁的计数器+1;当执行 monitorexit 指令时将锁计数器-1;当计数器为0时,锁就被释放了。如果获取对象失败了,那当前线程就要阻塞等待,直到对象锁被另外一个线程释放为止。Java 中 Synchronize 通过在对象头设置标记,达到了获取锁和释放锁的目的。 12题 Mybatis 通过动态代理,为需要拦截的接口生成代理对象以实现接口方法拦截功能,每当执行这 4 种接口对象的方法时,就会进入拦截方法,具体就是InvocationHandler 的 invoke()方法,只会拦截那些你指定需要拦截的方法。 实现方法:1.编写Intercepror接口的实现类;2.设置插件的签名,告诉mybatis拦截哪个对象的哪个方法;3.最后将插件注册到全局配置文件中。 11题 Mybatis可以映射枚举类,不单可以映射枚举类,Mybatis可以映射任何对象到表的一列上。映射方式为自定义一个TypeHandler,实现TypeHandler的setParameter()和getResult()接口方法。TypeHandler 有两个作用,一是完成从 javaType至jdbcType 的转换,二是完成jdbcType至javaType的转换,体现为 setParameter()和getResult()两个方法,分别代表设置sql问号占位符参数和获取列查询结果。 10题 Mybatis使用RowBounds对象进行分页,也可以直接编写sql实现分页,也可以使用Mybatis的分页插件。分页插件的原理:使用Mybatis提供的插件接口,实现自定义插件,在插件的拦截方法内拦截待执行的sql,然后重写sql,根据dialect方言,添加对应的物理分页语句和物理分页参数。举例:select * from student,拦截 sql 后重写为:select t.* from(select * from student)t limit 0,10。 9题 resultType和resultMap都是表示数据库表与pojo之间的映射规则的。类的名字和数据库相同时,可以直接设置resultType 参数为Pojo类。若不同或者有关联查询,需要设置resultMap将结果名字和Pojo名字进行转换。在项目中我们定义的resultMap多了property和column属性,实际也就是分别配置Pojo类的属性和对应的表字段之间的映射关系,多了这个映射关系以后,方便维护。 8题 之所以说Mybatis半自动化,是因为SQL语句需要用户自定义,SQL的解析、执行等工作由Mybatis执行。区别:Hibernate属于全自动 ORM 映射工具,使用Hibernate查询关联对象或者关联集合对象时,可以根据对象关系模型直接获取,所以它是全自动的。而 Mybatis 在查询关联对象或关联集合对象时,需要手动编写 sql 来完成,所以它是半自动ORM映射工具。 7题 MyBatis 的缓存分为一级缓存和二级缓存。一级缓存是SqlSession级别的缓存,默认就有,在操作数据库时需要构造 sqlSession对象,在对象中有一个(内存区域)数据结构(HashMap)用于存储缓存数据,不同的sqlSession之间的缓存数据区域(HashMap)是互相不影响的。二级缓存是mapper级别的缓存,默认是不打开的,多个SqlSession去操作同一个Mapper的sql语句,多个SqlSession去操作数据库得到数据会存在二级缓存区域,多个SqlSession可以共用二级缓存,二级缓存是跨SqlSession的。 6题 RequestMapping是一个用来处理请求地址映射的注解,可用于类或方法上。用于类上,表示类中的所有响应请求的方法都是以该地址作为父路径。用于方法上是为了细化映射,即根据特定的HTTP请求方法(GET、POST 方法等)、HTTP请求中是否携带特定参数等条件,将请求映射到匹配的方法上。 5题 1、前置通知(before advice):在目标方法调用之前执行; 2、后置通知(after returning advice):在目标方法调用之后执行,一旦目标方法产生异常不会执行; 3、最终通知(after(finally) advice):在目标调用方法之后执行,无论目标方法是否产生异常,都会执行; 4、异常通知(after throwing advice):在目标方法产生异常时执行; 5、环绕通知(around advice):在目标方法执行之前和执行之后都会执行,可以写一些非核心的业务逻辑,一般用来替代前置通知和后置通知。 4题 1、通过构造器或工厂方法创建Bean实例;2、为Bean的属性设置值和对其他Bean的引用;3、将Bean实例传递给Bean后置处理器的postProcessBeforeInitialization方法;4、调用Bean的初始方法(init-method);5、将bean实例传递给bean后置处理器的postProcessAfterInitialization方法;6、bean可以使用了;7、当容器关闭时,调用Bean的销毁方法(destroy-method) 3题 在TransactionDefinition接口中定义了五个表示隔离级别的常量: ISOLATION_DEFAULT:使用后端数据库默认的隔离级别,Mysql默认采用的REPEATABLE_READ隔离级别;Oracle默认采用的READ_COMMITTED隔离级别。 ISOLATION_READ_UNCOMMITTED:最低的隔离级别,允许读取尚未提交的数据变更,可能会导致脏读、幻读或不可重复读。 ISOLATION_READ_COMMITTED:允许读取并发事务已经提交的数据,可以阻止脏读,但是幻读或不可重复读仍有可能发生 ISOLATION_REPEATABLE_READ:对同一字段的多次读取结果都是一致的,除非数据是被本身事务自己所修改,可以阻止脏读和不可重复读,但幻读仍有可能发生。 ISOLATION_SERIALIZABLE:最高的隔离级别,完全服从ACID的隔离级别。所有的事务依次逐个执行,这样事务之间就完全不可能产生干扰,也就是说,该级别可以防止脏读、不可重复读以及幻读。但是这将严重影响程序的性能。通常情况下也不会用到该级别。 2 题 自动装配提供五种不同的模式供Spring容器用来自动装配beans之间的依赖注入: 1.默认的方式是不进行自动装配,通过手工设置ref 属性来进行装配bean。 2.byName:通过参数名自动装配,之后容器试图匹配、装配和该bean的属性具有相同名字的bean。 3.byType:按照参数的数据类型进行自动装配,之后容器试图匹配和装配和该bean的属性类型一样的bean。如果存在多个相同类型的bean对象,会出错。 4.constructor:使用构造方法完成对象注入,其实也是根据构造方法的参数类型进行对象查找,相当于采用byType的方式。 5.autodetect:如果找到默认的构造函数,则通过 constructor的方式自动装配,否则使用 byType的方式自动装配。在Spring3.0以后的版本此模式已被废弃,已经不再合法了。 1 题 循环依赖只会存在在单例实例中,多例循环依赖直接报错。Spring先用构造器实例化Bean对象,然后将实例化结束的对象放到一个Map中,并且Spring提供获取这个未设置属性的实例化对象的引用方法。当Spring实例化了A类、B类后,紧接着会去设置对象的属性,此时发现A类依赖B类,就会去Map中取出已经存在的单例B类对象,以此类推。因为所持有的都是引用,所以A类一改变B类也会跟着改变。从而解决循环依赖问题。

游客ih62co2qqq5ww 2020-03-03 18:05:36 0 浏览量 回答数 0

问题

【精品问答】python技术1000问(2)

问问小秘 2019-12-01 22:03:02 3129 浏览量 回答数 1

问题

Android SDK是什么?

nicenelly 2019-12-01 21:01:23 1531 浏览量 回答数 0

问题

DRDS 错误代码如何解决?

猫饭先生 2019-12-01 21:21:21 7993 浏览量 回答数 0

回答

一 系统介绍 Android 是Google开发的基于Linux平台的、开源的、智能手机操作系统。Android包括操作系统、中间件和应用程序,由于源代码开放,Android可以被移植到不同的硬件平台上。 围绕在Google的Android系统中,形成了移植开发和上层应用程序开发两个不同的开发方面。手机厂商从事移植开发工作,上层的应用程序开发可以由任何单位和个人完成,开发的过程可以基于真实的硬件系统,还可以基于仿真器环境。 作为一个手机平台,Android在技术上的优势主要有以下几点: - 全开放智能手机平台 - 多硬件平台的支持 - 使用众多的标准化技术 - 核心技术完整,统一 - 完善的SDK和文档 - 完善的辅助开发工具 Android的开发者可以在完备的开发环境中进行开发,Android的官方网站也提供了丰富的文档、资料。这样有利于Android系统的开发和运行在一个良好的生态环境中。 https://developer.android.com/about安卓开发者官方网站 从宏观的角度来看,Android是一个开放的软件系统,它包含了众多的源代码。从下至上,Android系统分成4个层次: 第1层次:Linux操作系统及驱动; 第2层次:本地代码(C/C++)框架; 第3层次:Java框架; 第4层次:Java应用程序。 Android系统的架构如图所示: 由于Android系统需要支持Java代码的运行,这部分内容是Android的运行环境(Runtime),由虚拟机和Java基本类组成。 对于Android应用程序的开发,主要关注第3层次和第4层次之间的接口。 二 学习路线 基础学习——JavaSE: 基础学习扩展——JavaEE: 基础学习扩展——Linux基础: Android开发学习——基础理论:系统架构分析: Android系统从底向上一共分了4层,每一层都把底层实现封装,并暴露调用接口给上一层。 Linux内核(Linux Kernel) Android运行在linux kernel 2.6之上,但是把linux内受GNU协议约束的部分做了取代,这样在Android的程序可以用于商业目的。 Linux 内核是硬件和软件层之间的抽象层。 中间件 中间件包括两部分: 核心库和运行时(libraries & Android runtime) 核心库包括,SurfaceManager 显示系统管理库,负责把2D或3D内容显示到屏幕;Media Framework 媒体库,负责支持图像,支持多种视频和音频的录制和回放;SQlite 数据库,一个功能强大的轻量级嵌入式关系数据库;WebKit 浏览器引擎等。 Dalvik虚拟机: 区别于Java虚拟机的是,每一个Android 应用程序都在它自己的进程中运行,都有一个属于自己的Dalvik 虚拟机,这一点可以让系统在运行时可以达到优化,程序间的影响大大降低。Dalvik虚拟机并非运行Java字节码,而是运行自己的字节码。 应用程序框架(Application Framework) 丰富而又可扩展性的视图(Views),可以用来构建应用程序, 它包括列表(lists),网格(grids), 文本框(text boxes),按钮( buttons), 可嵌入的web 浏览器。内容提供者(Content Providers)使得应用程序可以访问另一个应用程序的数据(如联系人数据库), 或者共享它们自己的数据。资源管理器(Resource Manager)提供非代码资源的访问,如本地字符串,图形,和布局文件( layoutfiles )。通知管理器(Notification Manager) 使得应用程序可以在状态栏中显示自定义的提示信息。活动管理器( Activity Manager) 用来管理应用程序生命周期并提供常用的导航回退功能。 三 基础知识 掌握java部分之后,可以使用开发工具进入android世界 您可以使用 Kotlin、Java 和 C++ 语言编写 Android 应用。Android SDK 工具会将您的代码连同任何数据和资源文件编译成一个 APK(Android 软件包),即带有 .apk 后缀的归档文件。一个 APK 文件包含 Android 应用的所有内容,它也是 Android 设备用来安装应用的文件。 每个 Android 应用都处于各自的安全沙盒中,并受以下 Android 安全功能的保护: • Android 操作系统是一种多用户 Linux 系统,其中的每个应用都是一个不同的用户; • 默认情况下,系统会为每个应用分配一个唯一的 Linux 用户 ID(该 ID 仅由系统使用,应用并不知晓)。系统会为应用中的所有文件设置权限,使得只有分配给该应用的用户 ID 才能访问这些文件; • 每个进程都拥有自己的虚拟机 (VM),因此应用代码独立于其他应用而运行。 • 默认情况下,每个应用都在其自己的 Linux 进程内运行。Android 系统会在需要执行任何应用组件时启动该进程,然后当不再需要该进程或系统必须为其他应用恢复内存时,其便会关闭该进程。 Android 系统实现了最小权限原则。换言之,默认情况下,每个应用只能访问执行其工作所需的组件,而不能访问其他组件。这样便能创建非常安全的环境,在此环境中,应用无法访问其未获得权限的系统部分。不过,应用仍可通过一些途径与其他应用共享数据以及访问系统服务: • 可以安排两个应用共享同一 Linux 用户 ID,在此情况下,二者便能访问彼此的文件。为节省系统资源,也可安排拥有相同用户 ID 的应用在同一 Linux 进程中运行,并共享同一 VM。应用还必须使用相同的证书进行签名。 • 应用可以请求访问设备数据(如用户的联系人、短信消息、可装载存储装置(SD 卡)、相机、蓝牙等)的权限。用户必须明确授予这些权限。如需了解详细信息,请参阅使用系统权限。 本文档的其余部分将介绍以下概念: • 用于定义应用的核心框架组件 • 用来声明组件和应用必需设备功能的清单文件。 • 与应用代码分离并允许应用针对各种设备配置适当优化其行为的资源。 应用组件 应用组件是 Android 应用的基本构建块。每个组件都是一个入口点,系统或用户可通过该入口点进入您的应用。有些组件会依赖于其他组件。 共有四种不同的应用组件类型: • Activity • 服务 • 广播接收器 • 内容提供程序 每种类型都有不同的用途和生命周期,后者会定义如何创建和销毁组件。以下部分将介绍应用组件的四种类型。 Activity Activity 是与用户交互的入口点。它表示拥有界面的单个屏幕。例如,电子邮件应用可能有一个显示新电子邮件列表的 Activity、一个用于撰写电子邮件的 Activity 以及一个用于阅读电子邮件的 Activity。尽管这些 Activity 通过协作在电子邮件应用中形成一种紧密结合的用户体验,但每个 Activity 都独立于其他 Activity 而存在。因此,其他应用可以启动其中任何一个 Activity(如果电子邮件应用允许)。例如,相机应用可以启动电子邮件应用内用于撰写新电子邮件的 Activity,以便用户共享图片。Activity 有助于完成系统和应用程序之间的以下重要交互: • 追踪用户当前关心的内容(屏幕上显示的内容),以确保系统继续运行托管 Activity 的进程。 • 了解先前使用的进程包含用户可能返回的内容(已停止的 Activity),从而更优先保留这些进程。 • 帮助应用处理终止其进程的情况,以便用户可以返回已恢复其先前状态的 Activity。 • 提供一种途径,让应用实现彼此之间的用户流,并让系统协调这些用户流。(此处最经典的示例是共享。) 您需将 Activity 作为 Activity 类的子类来实现。如需了解有关 Activity 类的更多信息,请参阅 Activity 开发者指南。 服务 服务是一个通用入口点,用于因各种原因使应用在后台保持运行状态。它是一种在后台运行的组件,用于执行长时间运行的操作或为远程进程执行作业。服务不提供界面。例如,当用户使用其他应用时,服务可能会在后台播放音乐或通过网络获取数据,但这不会阻断用户与 Activity 的交互。诸如 Activity 等其他组件可以启动服务,使该服务运行或绑定到该服务,以便与其进行交互。事实上,有两种截然不同的语义服务可以告知系统如何管理应用:已启动服务会告知系统使其运行至工作完毕。此类工作可以是在后台同步一些数据,或者在用户离开应用后继续播放音乐。在后台同步数据或播放音乐也代表了两种不同类型的已启动服务,而这些服务可以修改系统处理它们的方式: • 音乐播放是用户可直接感知的服务,因此,应用会向用户发送通知,表明其希望成为前台,从而告诉系统此消息;在此情况下,系统明白它应尽全力维持该服务进程运行,因为进程消失会令用户感到不快。 • 通常,用户不会意识到常规后台服务正处于运行状态,因此系统可以更自由地管理其进程。如果系统需要使用 RAM 来处理用户更迫切关注的内容,则其可能允许终止服务(然后在稍后的某个时刻重启服务)。 绑定服务之所以能运行,原因是某些其他应用(或系统)已表示希望使用该服务。从根本上讲,这是为另一个进程提供 API 的服务。因此,系统会知晓这些进程之间存在依赖关系,所以如果进程 A 绑定到进程 B 中的服务,系统便知道自己需使进程 B(及其服务)为进程 A 保持运行状态。此外,如果进程 A 是用户关心的内容,系统随即也知道将进程 B 视为用户关心的内容。由于存在灵活性(无论好坏),服务已成为非常有用的构建块,并且可实现各种高级系统概念。动态壁纸、通知侦听器、屏幕保护程序、输入方法、无障碍功能服务以及众多其他核心系统功能均可构建为在其运行时由应用实现、系统绑定的服务。 您需将服务作为 Service 的子类来实现。如需了解有关 Service 类的更多信息,请参阅服务开发者指南。 注意:如果您的应用面向 Android 5.0(API 级别 21)或更高版本,请使用 JobScheduler 类来调度操作。JobScheduler 的优势在于,它能通过优化作业调度来降低功耗,以及使用 Doze API,从而达到省电目的。如需了解有关使用此类的更多信息,请参阅 JobScheduler 参考文档。 广播接收器 借助广播接收器组件,系统能够在常规用户流之外向应用传递事件,从而允许应用响应系统范围内的广播通知。由于广播接收器是另一个明确定义的应用入口,因此系统甚至可以向当前未运行的应用传递广播。例如,应用可通过调度提醒来发布通知,以告知用户即将发生的事件。而且,通过将该提醒传递给应用的广播接收器,应用在提醒响起之前即无需继续运行。 许多广播均由系统发起,例如,通知屏幕已关闭、电池电量不足或已拍摄照片的广播。应用也可发起广播,例如,通知其他应用某些数据已下载至设备,并且可供其使用。尽管广播接收器不会显示界面,但其可以创建状态栏通知,在发生广播事件时提醒用户。但广播接收器更常见的用途只是作为通向其他组件的通道,旨在执行极少量的工作。例如,它可能会根据带 JobScheduler 的事件调度 JobService 来执行某项工作 广播接收器作为 BroadcastReceiver 的子类实现,并且每条广播都作为 Intent 对象进行传递。如需了解详细信息,请参阅 BroadcastReceiver 类。 内容提供程序 内容提供程序管理一组共享的应用数据,您可以将这些数据存储在文件系统、SQLite 数据库、网络中或者您的应用可访问的任何其他持久化存储位置。其他应用可通过内容提供程序查询或修改数据(如果内容提供程序允许)。例如,Android 系统可提供管理用户联系人信息的内容提供程序。 因此,任何拥有适当权限的应用均可查询内容提供程序(如 ContactsContract.Data),以读取和写入特定人员的相关信息。我们很容易将内容提供程序看作数据库上的抽象,因为其内置的大量 API 和支持时常适用于这一情况。但从系统设计的角度看,二者的核心目的不同。对系统而言,内容提供程序是应用的入口点,用于发布由 URI 架构识别的已命名数据项。因此,应用可以决定如何将其包含的数据映射到 URI 命名空间,进而将这些 URI 分发给其他实体。反之,这些实体也可使用分发的 URI 来访问数据。在管理应用的过程中,系统可以执行以下特殊操作: • 分配 URI 无需应用保持运行状态,因此 URI 可在其所属的应用退出后继续保留。当系统必须从相应的 URI 检索应用数据时,系统只需确保所属应用仍处于运行状态。 • 这些 URI 还会提供重要的细粒度安全模型。例如,应用可将其所拥有图像的 URI 放到剪贴板上,但将其内容提供程序锁定,以便其他应用程序无法随意访问它。当第二个应用尝试访问剪贴板上的 URI 时,系统可允许该应用通过临时的 URI 授权来访问数据,这样便只能访问 URI 后面的数据,而非第二个应用中的其他任何内容。 内容提供程序也适用于读取和写入您的应用不共享的私有数据。 内容提供程序作为 ContentProvider 的子类实现,并且其必须实现一组标准 API,以便其他应用能够执行事务。如需了解详细信息,请参阅内容提供程序开发者指南。 Android 系统设计的独特之处在于,任何应用都可启动其他应用的组件。例如,当您想让用户使用设备相机拍摄照片时,另一个应用可能也可执行该操作,因而您的应用便可使用该应用,而非自行产生一个 Activity 来拍摄照片。您无需加入甚至链接到该相机应用的代码。只需启动拍摄照片的相机应用中的 Activity 即可。完成拍摄时,系统甚至会将照片返回您的应用,以便您使用。对用户而言,这就如同相机是您应用的一部分。 当系统启动某个组件时,它会启动该应用的进程(如果尚未运行),并实例化该组件所需的类。例如,如果您的应用启动相机应用中拍摄照片的 Activity,则该 Activity 会在属于相机应用的进程(而非您的应用进程)中运行。因此,与大多数其他系统上的应用不同,Android 应用并没有单个入口点(即没有 main() 函数)。 由于系统在单独的进程中运行每个应用,且其文件权限会限制对其他应用的访问,因此您的应用无法直接启动其他应用中的组件,但 Android 系统可以。如要启动其他应用中的组件,请向系统传递一条消息,说明启动特定组件的 Intent。系统随后便会为您启动该组件。 启动组件 在四种组件类型中,有三种(Activity、服务和广播接收器)均通过异步消息 Intent 进行启动。Intent 会在运行时对各个组件进行互相绑定。您可以将 Intent 视为从其他组件(无论该组件是属于您的应用还是其他应用)请求操作的信使。 您需使用 Intent 对象创建 Intent,该对象通过定义消息来启动特定组件(显式 Intent)或特定的组件类型(隐式 Intent)。 对于 Activity 和服务,Intent 会定义要执行的操作(例如,查看或发送某内容),并且可指定待操作数据的 URI,以及正在启动的组件可能需要了解的信息。例如,Intent 可能会传达对 Activity 的请求,以便显示图像或打开网页。在某些情况下,您可以通过启动 Activity 来接收结果,这样 Activity 还会返回 Intent 中的结果。例如,您可以发出一个 Intent,让用户选取某位联系人并将其返回给您。返回 Intent 包含指向所选联系人的 URI。 对于广播接收器,Intent 只会定义待广播的通知。例如,指示设备电池电量不足的广播只包含指示“电池电量不足”的已知操作字符串。 与 Activity、服务和广播接收器不同,内容提供程序并非由 Intent 启动。相反,它们会在成为 ContentResolver 的请求目标时启动。内容解析程序会通过内容提供程序处理所有直接事务,因此通过提供程序执行事务的组件便无需执行事务,而是改为在 ContentResolver 对象上调用方法。这会在内容提供程序与请求信息的组件之间留出一个抽象层(以确保安全)。 每种组件都有不同的启动方法: • 如要启动 Activity,您可以向 startActivity() 或 startActivityForResult() 传递 Intent(当您想让 Activity 返回结果时),或者为其安排新任务。 • 在 Android 5.0(API 级别 21)及更高版本中,您可以使用 JobScheduler 类来调度操作。对于早期 Android 版本,您可以通过向 startService() 传递 Intent 来启动服务(或对执行中的服务下达新指令)。您也可通过向将 bindService() 传递 Intent 来绑定到该服务。 • 您可以通过向 sendBroadcast()、sendOrderedBroadcast() 或 sendStickyBroadcast() 等方法传递 Intent 来发起广播。 • 您可以通过在 ContentResolver 上调用 query(),对内容提供程序执行查询。 如需了解有关 Intent 用法的详细信息,请参阅 Intent 和 Intent 过滤器文档。以下文档将为您详细介绍如何启动特定组件:Activity、服务、BroadcastReceiver 和内容提供程序。

问问小秘 2020-03-03 09:47:38 0 浏览量 回答数 0

回答

一、内存溢出类型 1、java.lang.OutOfMemoryError: PermGen space JVM管理两种类型的内存,堆和非堆。堆是给开发人员用的上面说的就是,是在JVM启动时创建;非堆是留给JVM自己用的,用来存放类的信息的。它和堆不同,运行期内GC不会释放空间。如果web app用了大量的第三方jar或者应用有太多的class文件而恰好MaxPermSize设置较小,超出了也会导致这块内存的占用过多造成溢出,或者tomcat热部署时侯不会清理前面加载的环境,只会将context更改为新部署的,非堆存的内容就会越来越多。 PermGen space的全称是Permanent Generation space,是指内存的永久保存区域,这块内存主要是被JVM存放Class和Meta信息的,Class在被Loader时就会被放到PermGen space中,它和存放类实例(Instance)的Heap区域不同,GC(Garbage Collection)不会在主程序运行期对PermGen space进行清理,所以如果你的应用中有很CLASS的话,就很可能出现PermGen space错误,这种错误常见在web服务器对JSP进行pre compile的时候。如果你的WEB APP下都用了大量的第三方jar, 其大小超过了jvm默认的大小(4M)那么就会产生此错误信息了。 一个最佳的配置例子:(经过本人验证,自从用此配置之后,再未出现过tomcat死掉的情况) set JAVA_OPTS=-Xms800m -Xmx800m -XX:PermSize=128M -XX:MaxNewSize=256m -XX:MaxPermSize=256m 2、java.lang.OutOfMemoryError: Java heap space 第一种情况是个补充,主要存在问题就是出现在这个情况中。其默认空间(即-Xms)是物理内存的1/64,最大空间(-Xmx)是物理内存的1/4。如果内存剩余不到40%,JVM就会增大堆到Xmx设置的值,内存剩余超过70%,JVM就会减小堆到Xms设置的值。所以服务器的Xmx和Xms设置一般应该设置相同避免每次GC后都要调整虚拟机堆的大小。假设物理内存无限大,那么JVM内存的最大值跟操作系统有关,一般32位机是1.5g到3g之间,而64位的就不会有限制了。 注意:如果Xms超过了Xmx值,或者堆最大值和非堆最大值的总和超过了物理内存或者操作系统的最大限制都会引起服务器启动不起来。 垃圾回收GC的角色 JVM调用GC的频度还是很高的,主要两种情况下进行垃圾回收: 当应用程序线程空闲;另一个是java内存堆不足时,会不断调用GC,若连续回收都解决不了内存堆不足的问题时,就会报out of memory错误。因为这个异常根据系统运行环境决定,所以无法预期它何时出现。 根据GC的机制,程序的运行会引起系统运行环境的变化,增加GC的触发机会。 为了避免这些问题,程序的设计和编写就应避免垃圾对象的内存占用和GC的开销。显示调用System.GC()只能建议JVM需要在内存中对垃圾对象进行回收,但不是必须马上回收, 一个是并不能解决内存资源耗空的局面,另外也会增加GC的消耗。 二、JVM内存区域组成 简单的说java中的堆和栈 java把内存分两种:一种是栈内存,另一种是堆内存 1。在函数中定义的基本类型变量和对象的引用变量都在函数的栈内存中分配; 2。堆内存用来存放由new创建的对象和数组 在函数(代码块)中定义一个变量时,java就在栈中为这个变量分配内存空间,当超过变量的作用域后,java会自动释放掉为该变量所分配的内存空间;在堆中分配的内存由java虚拟机的自动垃圾回收器来管理 堆的优势是可以动态分配内存大小,生存期也不必事先告诉编译器,因为它是在运行时动态分配内存的。缺点就是要在运行时动态分配内存,存取速度较慢; 栈的优势是存取速度比堆要快,缺点是存在栈中的数据大小与生存期必须是确定的无灵活性。 java堆分为三个区:New、Old和Permanent GC有两个线程: 新创建的对象被分配到New区,当该区被填满时会被GC辅助线程移到Old区,当Old区也填满了会触发GC主线程遍历堆内存里的所有对象。Old区的大小等于Xmx减去-Xmn java栈存放 栈调整:参数有+UseDefaultStackSize -Xss256K,表示每个线程可申请256k的栈空间 每个线程都有他自己的Stack 三、JVM如何设置虚拟内存 提示:在JVM中如果98%的时间是用于GC且可用的Heap size 不足2%的时候将抛出此异常信息。 提示:Heap Size 最大不要超过可用物理内存的80%,一般的要将-Xms和-Xmx选项设置为相同,而-Xmn为1/4的-Xmx值。 提示:JVM初始分配的内存由-Xms指定,默认是物理内存的1/64;JVM最大分配的内存由-Xmx指定,默认是物理内存的1/4。 默认空余堆内存小于40%时,JVM就会增大堆直到-Xmx的最大限制;空余堆内存大于70%时,JVM会减少堆直到-Xms的最小限制。因此服务器一般设置-Xms、-Xmx相等以避免在每次GC 后调整堆的大小。 提示:假设物理内存无限大的话,JVM内存的最大值跟操作系统有很大的关系。 简单的说就32位处理器虽然可控内存空间有4GB,但是具体的操作系统会给一个限制, 这个限制一般是2GB-3GB(一般来说Windows系统下为1.5G-2G,Linux系统下为2G-3G),而64bit以上的处理器就不会有限制了 提示:注意:如果Xms超过了Xmx值,或者堆最大值和非堆最大值的总和超过了物理内存或者操作系统的最大限制都会引起服务器启动不起来。 提示:设置NewSize、MaxNewSize相等,"new"的大小最好不要大于"old"的一半,原因是old区如果不够大会频繁的触发"主" GC ,大大降低了性能 JVM使用-XX:PermSize设置非堆内存初始值,默认是物理内存的1/64; 由XX:MaxPermSize设置最大非堆内存的大小,默认是物理内存的1/4。 解决方法:手动设置Heap size 修改TOMCAT_HOME/bin/catalina.bat 在“echo "Using CATALINA_BASE: $CATALINA_BASE"”上面加入以下行: JAVA_OPTS="-server -Xms800m -Xmx800m -XX:MaxNewSize=256m" 四、性能检查工具使用 定位内存泄漏: JProfiler工具主要用于检查和跟踪系统(限于Java开发的)的性能。JProfiler可以通过时时的监控系统的内存使用情况,随时监视垃圾回收,线程运行状况等手段,从而很好的监视JVM运行情况及其性能。 1. 应用服务器内存长期不合理占用,内存经常处于高位占用,很难回收到低位; 2. 应用服务器极为不稳定,几乎每两天重新启动一次,有时甚至每天重新启动一次; 3. 应用服务器经常做Full GC(Garbage Collection),而且时间很长,大约需要30-40秒,应用服务器在做Full GC的时候是不响应客户的交易请求的,非常影响系统性能。 因为开发环境和产品环境会有不同,导致该问题发生有时会在产品环境中发生,通常可以使用工具跟踪系统的内存使用情况,在有些个别情况下或许某个时刻确实是使用了大量内存导致out of memory,这时应继续跟踪看接下来是否会有下降, 如果一直居高不下这肯定就因为程序的原因导致内存泄漏。 五、不健壮代码的特征及解决办法 1、尽早释放无用对象的引用。好的办法是使用临时变量的时候,让引用变量在退出活动域后,自动设置为null,暗示垃圾收集器来收集该对象,防止发生内存泄露。 对于仍然有指针指向的实例,jvm就不会回收该资源,因为垃圾回收会将值为null的对象作为垃圾,提高GC回收机制效率; 2、我们的程序里不可避免大量使用字符串处理,避免使用String,应大量使用StringBuffer,每一个String对象都得独立占用内存一块区域; String str = "aaa"; String str2 = "bbb"; String str3 = str + str2;//假如执行此次之后str ,str2以后再不被调用,那它就会被放在内存中等待Java的gc去回收,程序内过多的出现这样的情况就会报上面的那个错误,建议在使用字符串时能使用StringBuffer就不要用String,这样可以省不少开销; 3、尽量少用静态变量,因为静态变量是全局的,GC不会回收的; 4、避免集中创建对象尤其是大对象,JVM会突然需要大量内存,这时必然会触发GC优化系统内存环境;显示的声明数组空间,而且申请数量还极大。 这是一个案例想定供大家警戒 使用jspsmartUpload作文件上传,运行过程中经常出现java.outofMemoryError的错误, 检查之后发现问题:组件里的代码 m_totalBytes = m_request.getContentLength(); m_binArray = new byte[m_totalBytes]; 问题原因是totalBytes这个变量得到的数极大,导致该数组分配了很多内存空间,而且该数组不能及时释放。解决办法只能换一种更合适的办法,至少是不会引发outofMemoryError的方式解决。 5、尽量运用对象池技术以提高系统性能;生命周期长的对象拥有生命周期短的对象时容易引发内存泄漏,例如大集合对象拥有大数据量的业务对象的时候,可以考虑分块进行处理,然后解决一块释放一块的策略。 6、不要在经常调用的方法中创建对象,尤其是忌讳在循环中创建对象。可以适当的使用hashtable,vector 创建一组对象容器,然后从容器中去取那些对象,而不用每次new之后又丢弃 7、一般都是发生在开启大型文件或跟数据库一次拿了太多的数据,造成 Out Of Memory Error 的状况,这时就大概要计算一下数据量的最大值是多少,并且设定所需最小及最大的内存空间值。 “答案来源于网络,供您参考” 希望以上信息可以帮到您!

牧明 2019-12-02 02:16:21 0 浏览量 回答数 0

问题

深入理解 Redis 主键失效原理及实现机制:报错

kun坤 2020-06-07 14:14:55 0 浏览量 回答数 1

回答

概述 当客户端访问目标服务器出现ping丢包或ping不通时,可以通过tracert或mtr等工具进行链路测试来判断问题根源。本文介绍如何通过工具进行链路测试和分析。 详细信息 阿里云提醒您: 如果您对实例或数据有修改、变更等风险操作,务必注意实例的容灾、容错能力,确保数据安全。 如果您对实例(包括但不限于ECS、RDS)等进行配置与数据修改,建议提前创建快照或开启RDS日志备份等功能。 如果您在阿里云平台授权或者提交过登录账号、密码等安全信息,建议您及时修改。 本文分别介绍如下链路测试方法。 链路测试工具 测试结果的简要分析 常见的链路异常场景 链路测试步骤 测试完成后的解决方法 链路测试工具 操作系统类型不同,链路测试所使用的工具也有所不同。简要介绍如下。 Linux系统 此处简单介绍两个链路测试工具。 工具一:mtr命令 mtr(My traceroute)几乎是所有Linux发行版本预装的网络测试工具。其将ping和traceroute的功能合并,所以功能更强大。mtr默认发送ICMP数据包进行链路探测。您也可以通过“-u”参数来指定使用UDP数据包进行探测。相对于traceroute只会做一次链路跟踪测试,mtr会对链路上的相关节点做持续探测并给出相应的统计信息。所以,mtr能避免节点波动对测试结果的影响,所以其测试结果更正确,建议优先使用。 用法说明 mtr [-BfhvrwctglxspQomniuT46] [--help] [--version] [--report] [--report-wide] [--report-cycles=COUNT] [--curses] [--gtk] [--csv|-C] [--raw] [--xml] [--split] [--mpls] [--no-dns] [--show-ips] [--address interface] [--filename=FILE|-F] [--ipinfo=item_no|-y item_no] [--aslookup|-z] [--psize=bytes/-s bytes] [--order fields] [--report-wide|-w] [--inet] [--inet6] [--max-ttl=NUM] [--first-ttl=NUM] [--bitpattern=NUM] [--tos=NUM] [--udp] [--tcp] [--port=PORT] [--timeout=SECONDS] [--interval=SECONDS] HOSTNAME 常见可选参数说明 --report:以报告模式显示输出。 --split:将每次追踪的结果分别列出来,而非统计整个结果。 --psize:指定ping数据包的大小。 --no-dns:不对IP地址做域名反解析。 --address:主机有多个IP地址时,设置发送数据包的IP地址。 -4:只使用IPv4协议。 -6:只使用IPv6协议。 另外,也可以在mtr运行过程中,输入类似如下的字母来快速切换模式。 ?或h:显示帮助菜单。 d:切换显示模式。 n:启用或禁用DNS域名解析。 u:切换使用ICMP或UDP数据包进行探测。 命令输出示例 返回结果说明 默认配置下,返回结果中各数据列的说明如下。 第一列(Host):节点IP地址和域名。按 n 键可切换显示。 第二列(Loss%):节点丢包率。 第三列(Snt):每秒发送数据包数。默认值是10,可以通过“-c”参数指定。 第四列(Last):最近一次的探测延迟。 第五、六、七列(Avg、Best、Worst):分别是探测延迟的平均值、最小值和最大值。 第八列(StDev):标准偏差。越大说明相应节点越不稳定。 工具二:traceroute命令 traceroute也是几乎所有Linux发行版本预装的网络测试工具,用于跟踪Internet协议(IP)数据包传送到目标地址时经过的路径。traceroute先发送小的具有最大存活时间值(Max_TTL)的UDP探测数据包,然后侦听从网关开始的整个链路上的ICMP TIME_EXCEEDED响应。探测从TTL=1开始,TTL值逐步增加,直至接收到ICMP PORT_UNREACHABLE消息。ICMP PORT_UNREACHABLE消息用于标识目标主机已经被定位,或命令已经达到允许跟踪的最大TTL值。traceroute默认发送UDP数据包进行链路探测。可以通过“-I”参数来指定使用ICMP数据包进行探测。 用法说明 traceroute [-I] [ -m Max_ttl ] [ -n ] [ -p Port ] [ -q Nqueries ] [ -r ] [ -s SRC_Addr ] [ -t TypeOfService ] [ -f flow ] [ -v ] [ -w WaitTime ] Host [ PacketSize ] 常见可选参数说明 -d:使用Socket层级的排错功能。 -f:设置第一个检测数据包的存活数值TTL的大小。 -F:设置不要分段标识。 -g:设置来源路由网关,最多可设置8个。 -i:主机有多个网卡时,使用指定的网卡发送数据包。 -I:使用ICMP数据包替代UDP数据包进行探测。 -m:设置检测数据包的最大存活数值TTL的大小。 -n:直接使用IP地址而非主机名称(禁用DNS反查)。 -p:设置UDP传输协议的通信端口。 -r:忽略普通的Routing Table,直接将数据包发送到目标主机上。 -s:设置本地主机发送数据包的IP地址。 -t:设置检测数据包的TOS数值。 -v:详细显示指令的执行过程。 -w:设置等待远端主机回包时间。 -x:开启或关闭数据包的正确性检验。 命令输出示例 Windows系统 此处简单介绍两个链路测试工具。 工具一:WinMTR(建议优先使用) WinMTR是mtr工具在Windows环境下的图形化实现,但进行了功能简化,只支持部分mtr的参数。WinMTR默认发送ICMP数据包进行探测,无法切换。和mtr一样,相比tracert,WinMTR能避免节点波动对测试结果的影响,所以测试结果更正确。所以在WinMTR可用的情况下,建议优先使用WinMTR进行链路测试。 用法说明 WinMTR无需安装,直接解压运行即可。操作方法非常简单,说明如下。 如下图所示,运行程序后,在 Host 字段输入目标服务器域名或IP,注意不要包含空格。 单击 Start 开始测试。开始测试后,相应按钮变成了 Stop。 运行一段时间后,单击 Stop 停止测试。 其它选项说明如下。 Copy Text to clipboard:将测试结果以文本格式复制到粘贴板。 Copy HTML to clipboard:将测试结果以HTML格式复制到粘贴板。 Export TEXT:将测试结果以文本格式导出到指定文件。 Export HTML:将测试结果以HTML格式导出到指定文件。 Options:可选参数,包括的可选参数如下。 Interval(sec):每次探测的间隔(过期)时间。默认为1秒。 ping size(bytes):ping探测所使用的数据包大小,默认为64字节。 Max hosts in LRU list:LRU列表支持的最大主机数,默认值为128。 Resolve names:通过反查IP地址,以域名显示相关节点。 返回结果说明 默认配置下,返回结果中各数据列的说明如下。 第一列(Hostname):节点的IP或域名。 第二列(Nr):节点编号。 第三列(Loss%):节点丢包率。 第四列(Sent):已发送的数据包数量。 第五列(Recv):已成功接收的数据包数量。 第六、七、八、九列(Best 、Avg、Worst、Last):分别是到相应节点延迟的最小值、平均值、最大值和最后一次值。 工具二:tracert命令行工具 tracert(Trace Route)是Windows自带的网络诊断命令行程序,用于跟踪Internet协议(IP)数据包传送到目标地址时经过的路径。 tracert通过向目标地址发送 ICMP 数据包来确定到目标地址的路由。在这些数据包中,tracert使用了不同的IP“生存期”,即TTL值。由于要求沿途的路由器在转发数据包前必须至少将TTL减少1,因此TTL实际上相当于一个跃点计数器(hop counter)。当某个数据包的TTL达到0时,相应节点就会向源计算机发送一个ICMP超时的消息。 tracert第一次发送TTL为1的数据包,并在每次后续传输时将TTL增加1,直到目标地址响应或达到TTL的最大值。中间路由器发送回来的ICMP超时消息中包含了相应节点的信息。 用法说明 tracert [-d] [-h maximum_hops] [-j host-list] [-w timeout] [-R] [-S srcaddr] [-4] [-6] target_name 常见可选参数说明 -d:不要将地址解析为主机名(禁用DNS反解)。 -h:maximum_hops,指定搜索目标地址时的最大跃点数。 -j: host-list,指定沿主机列表的松散源路由。 -w:timeout,等待每个回复的超时时间(以毫秒为单位)。 -R:跟踪往返行程路径(仅适用于IPv6)。 -S:srcaddr,要使用的源地址(仅适用于IPv6)。 -4:强制使用IPv4。 -6:强制使用IPv6。 target_host:目标主机域名或IP地址。 命令输出示例 C:> tracert -d 223.5.5.5 通过最多 30 个跃点跟踪到 223.5.5.5 的路由 1 请求超时。 2 9 ms 3 ms 12 ms 192.168.X.X 3 4 ms 9 ms 2 ms X.X.X.X 4 9 ms 2 ms 1 ms XX.XX.XX.XX 5 11 ms 211.XX.X.XX 6 3 ms 2 ms 2 ms 2XX.XX.1XX.XX 7 2 ms 2 ms 1 ms 42.XX.2XX.1XX 8 32 ms 4 ms 3 ms 42.XX.2XX.2XX 9 请求超时。 10 3 ms 2 ms 2 ms 223.5.5.5 跟踪完成。 测试结果的简要分析 由于mtr(WinMTR)有更高的准确性,本文以其测试结果为例,参考如下要点进行分析。此处分析时以如下示例图为基础。 要点一:网络区域 正常情况下,从客户端到目标服务器的整个链路中会包含如下区域。 客户端本地网络,即本地局域网和本地网络提供商网络。如上图中的区域A。如果该区域出现异常,并且是客户端本地网络中的节点出现异常,则需要对本地网络进行相应的排查分析。如果是本地网络提供商网络出现异常,则需要向当地运营商反馈问题。 运营商骨干网络。如上图中的区域B。如果该区域出现异常,可以根据异常节点的IP查询其所属的运营商,直接向对应运营商进行反馈,或者通过阿里云技术支持,向运营商进行反馈。 目标服务器本地网络,即目标服务器所属提供商的网络。如上图中的区域C。如果该区域出现异常,需要向目标服务器所属的网络运营商反馈问题。 要点二:链路负载均衡 如上图中的区域D。如果中间链路某些部分启用了链路负载均衡,则mtr只会对首尾节点进行编号和探测统计。中间节点只会显示相应的IP或域名信息。 要点三:结合Avg(平均值)和StDev(标准偏差)综合判断 由于链路抖动或其它因素的影响,节点的Best和Worst值可能相差很大。Avg统计了自链路测试以来所有探测的平均值,所以能更好的反应出相应节点的网络质量。而StDev越高,则说明数据包在相应节点的延时值越不相同,即越离散。所以标准偏差值可用于协助判断Avg是否真实反应了相应节点的网络质量。例如,如果标准偏差很大,说明数据包的延迟是不确定的。可能某些数据包延迟很小,例如25ms,而另一些延迟却很大,例如350ms,但最终得到的平均延迟反而可能是正常的。所以,此时Avg并不能很好的反应出实际的网络质量情况。 综上,建议的分析标准如下。 如果StDev很高,则同步观察相应节点的Best和Worst,来判断相应节点是否存在异常。 如果StDev不高,则通过Avg来判断相应节点是否存在异常。 注:上述StDev高或者不高,并没有具体的时间范围标准。而需要根据同一节点其它列的延迟值大小来进行相对评估。比如,如果Avg为30ms,那么,当StDev为25ms,则认为是很高的偏差。而如果Avg为325ms,则StDev同样为25ms,反而认为是不高的偏差。 要点四:Loss%(丢包率)的判断 任一节点的Loss%(丢包率)如果不为零,则说明这一跳网络可能存在问题。导致相应节点丢包的原因通常有如下两种。 运营商基于安全或性能需求,限制了节点的ICMP发送速率,导致丢包。 节点确实存在异常,导致丢包。 结合异常节点及其后续节点的丢包情况,并参考如下内容,判定丢包原因。 如果随后节点均没有丢包,则通常表示异常节点丢包是由于运营商策略限制所致。可以忽略相关丢包。如上图中的第2跳所示。 如果随后节点也出现丢包,则通常说明异常节点确实存在网络异常,导致丢包。如上图中的第5跳所示。 另外,上述两种情况可能同时发生,即相应节点既存在策略限速,又存在网络异常。对于这种情况,如果异常节点及其后续节点连续出现丢包,而且各节点的丢包率不同,则通常以最后几跳的丢包率为准。如上图所示,在第 5、6、7跳均出现了丢包。所以,最终丢包情况,以第7跳的40%作为参考。 要点五:关于延迟 关于延迟,有如下两种场景。 场景一:延迟跳变 如果在某一跳之后延迟明显陡增,则通常判断该节点存在网络异常。如上图所示,从第5跳之后的后续节点延迟明显陡增,则推断是第5跳节点出现了网络异常。不过,高延迟并不一定完全意味着相应节点存在异常。如上图所示,第5跳之后,虽然后续节点延迟明显陡增,但测试数据最终仍然正常到达了目的主机。所以,延迟大也有可能是在数据回包链路中引发的。所以,需要结合反向链路测试一并分析。 场景二:ICMP限速导致延迟增加 ICMP策略限速也可能会导致相应节点的延迟陡增,但后续节点通常会恢复正常。如上图所示,第3跳有100%的丢包率,同时延迟也明显陡增。但随后节点的延迟马上恢复了正常。所以判断该节点的延迟陡增及丢包是由于策略限速所致。 常见的链路异常场景 常见的链路异常场景及测试报告如下。 场景一:目标主机网络配置不当 示例数据如下。 [root@mycentos6 ~]# mtr —no-dns www.google.com My traceroute [v0.75] mycentos6.6 (0.0.0.0) Wed Jun 15 19:06:29 2016 Keys: Help Display mode Packets Pings Host Loss% Snt Last Avg Best Wrst StDev 1. ??? 2. ??? 3. 1XX.X.X.X 0.0% 10 521.3 90.1 2.7 521.3 211.3 4. 11X.X.X.X 0.0% 10 2.9 4.7 1.6 10.6 3.9 5. 2X.X.X.X 80.0% 10 3.0 3.0 3.0 3.0 0.0 6. 2X.XX.XX.XX 0.0% 10 1.7 7.2 1.6 34.9 13.6 7. 1XX.1XX.XX.X 0.0% 10 5.2 5.2 5.1 5.2 0.0 8. 2XX.XX.XX.XX 0.0% 10 5.3 5.2 5.1 5.3 0.1 9. 173.194.200.105 100.0% 10 0.0 0.0 0.0 0.0 0.0 在该示例中,数据包在目标地址出现了100%的丢包。从数据上看是数据包没有到达,其实很有可能是目标服务器相关安全策略(比如防火墙、iptables 等)禁用了ICMP所致,导致目的主机无法发送任何应答。所以,该场景需要排查目标服务器的安全策略配置。 场景二:ICMP限速 示例数据如下。 [root@mycentos6 ~]# mtr --no-dns www.google.com My traceroute [v0.75] mycentos6.6 (0.0.0.0) Wed Jun 15 19:06:29 2016 Keys: Help Display mode Packets Pings Host Loss% Snt Last Avg Best Wrst StDev 1. 63.247.X.X 0.0% 10 0.3 0.6 0.3 1.2 0.3 2. 63.247.X.XX 0.0% 10 0.4 1.0 0.4 6.1 1.8 3. 209.51.130.213 0.0% 10 0.8 2.7 0.8 19.0 5.7 4. aix.pr1.atl.google.com 0.0% 10 6.7 6.8 6.7 6.9 0.1 5. 72.14.233.56 60.0% 10 27.2 25.3 23.1 26.4 2.9 6. 209.85.254.247 0.0% 10 39.1 39.4 39.1 39.7 0.2 7. 64.233.174.46 0.0% 10 39.6 40.4 39.4 46.9 2.3 8. gw-in-f147.1e100.net 0.0% 10 39.6 40.5 39.5 46.7 2.2 在该示例中,在第5跳出现了明显的丢包,但后续节点均未见异常。所以推断是该节点ICMP限速所致。该场景对最终客户端到目标服务器的数据传输不会有影响,所以,分析的时候可以忽略。 场景三:环路 示例数据如下。 [root@mycentos6 ~]# mtr —no-dns www.google.com My traceroute [v0.75] mycentos6.6 (0.0.0.0) Wed Jun 15 19:06:29 2016 Keys: Help Display mode Packets Pings Host Loss% Snt Last Avg Best Wrst StDev 1. 63.247.7X.X 0.0% 10 0.3 0.6 0.3 1.2 0.3 2. 63.247.6X.X 0.0% 10 0.4 1.0 0.4 6.1 1.8 3. 209.51.130.213 0.0% 10 0.8 2.7 0.8 19.0 5.7 4. aix.pr1.atl.google.com 0.0% 10 6.7 6.8 6.7 6.9 0.1 5. 72.14.233.56 0.0% 10 0.0 0.0 0.0 0.0 0.0 6. 72.14.233.57 0.0% 10 0.0 0.0 0.0 0.0 0.0 7. 72.14.233.56 0.0% 10 0.0 0.0 0.0 0.0 0.0 8. 72.14.233.57 0.0% 10 0.0 0.0 0.0 0.0 0.0 9 ??? 0.0% 10 0.0 0.0 0.0 0.0 0.0 在该示例中,数据包在第5跳之后出现了循环跳转,导致最终无法到达目标服务器。这通常是由于运营商相关节点路由配置异常所致。所以,该场景需要联系相应节点归属运营商处理。 场景四:链路中断 示例数据如下。 [root@mycentos6 ~]# mtr —no-dns www.google.com My traceroute [v0.75] mycentos6.6 (0.0.0.0) Wed Jun 15 19:06:29 2016 Keys: Help Display mode Packets Pings Host Loss% Snt Last Avg Best Wrst StDev 1. 63.247.7X.X 0.0% 10 0.3 0.6 0.3 1.2 0.3 2. 63.247.6X.X 0.0% 10 0.4 1.0 0.4 6.1 1.8 3. 209.51.130.213 0.0% 10 0.8 2.7 0.8 19.0 5.7 4. aix.pr1.atl.google.com 0.0% 10 6.7 6.8 6.7 6.9 0.1 5. ??? 0.0% 10 0.0 0.0 0.0 0.0 0.0 6. ??? 0.0% 10 0.0 0.0 0.0 0.0 0.0 7. ??? 0.0% 10 0.0 0.0 0.0 0.0 0.0 8. ??? 0.0% 10 0.0 0.0 0.0 0.0 0.0 9 ??? 0.0% 10 0.0 0.0 0.0 0.0 0.0 在该示例中,数据包在第4跳之后就无法收到任何反馈。这通常是由于相应节点中断所致。建议结合反向链路测试做进一步确认。该场景需要联系相应节点归属运营商处理。 链路测试步骤 通常情况下,链路测试步骤如下图所示。 相关步骤的详情说明如下。 步骤一:获取本地网络对应的公网IP 在客户端本地网络内访问淘宝IP地址库,获取本地网络对应的公网IP地址。 步骤二:正向链路测试(ping和mtr) 从客户端向目标服务器做如下测试。 从客户端向目标服务器域名或IP做持续的ping测试,建议至少ping 100个数据包,记录测试结果。 根据客户端操作系统的不同,使用WinMTR或mtr,设置测试目的地址为目标服务器域名或IP,然后进行链路测试,记录测试结果。 步骤三:反向链路测试(ping和mtr) 进入目标服务器系统内部做如下测试。 从目标服务器向步骤一获取的客户端IP做持续的ping测试,建议至少ping 100个数据包,记录测试结果。 根据目标服务器操作系统的不同,使用WinMTR或mtr,设置测试目的地址为客户端的IP地址,然后进行链路测试,记录测试结果。 步骤四:测试结果分析 参阅测试结果的简要分析,对测试结果进行分析。确认异常节点后,访问如下链接或其他可以查询IP归属地的网站,获取该异常节点的归属运营商信息。如果是客户端本地网络相关节点出现异常,则需要对本地网络进行相应排查分析。如果是运营商相关节点出现异常,则需要向运营商反馈问题。查询结果类似如下。 测试完成后的解决方法 当出现ping丢包或ping不通时,首先请参考云服务器ECS网络故障诊断,排查是否为网络故障。 如果确认是因系统中病毒导致使用ping命令测试ECS实例的IP地址间歇性丢包,则可参考使用ping命令测试ECS实例的IP地址间歇性丢包进行处理。 如果是因删除ECS实例的默认安全组规则导致无法ping通ECS实例,可参考删除ECS实例的默认安全组规则导致无法ping通ECS实例进行处理。 如果在Linux系统内核没有禁PING的情况下,是因系统内部防火墙策略设置导致ECS服务器PING不通。可参考Linux系统的ECS中没有禁PING却PING不通的解决方法。

1934890530796658 2020-03-25 23:17:54 0 浏览量 回答数 0

问题

SSH面试题

琴瑟 2019-12-01 21:46:22 3489 浏览量 回答数 0
阿里云大学 云服务器ECS com域名 网站域名whois查询 开发者平台 小程序定制 小程序开发 国内短信套餐包 开发者技术与产品 云数据库 图像识别 开发者问答 阿里云建站 阿里云备案 云市场 万网 阿里云帮助文档 免费套餐 开发者工具 企业信息查询 小程序开发制作 视频内容分析 企业网站制作 视频集锦 代理记账服务 企业建站模板