• 关于

    错误和异常处理介绍以及处理错误方式

    的搜索结果

回答

在Logstore列表页面单击诊断可以查看当前Logstore的所有日志采集报错,本文档介绍具体报错类型及对应的处理方式。 若您遇到其他问题,请提交工单处理。 错误类型 错误说明 处理方式 LOGFILE_PERMINSSION_ALARM Logtail无权限读取指定文件。 检查服务器Logtail的启动账户,建议以root方式启动。 SPLIT_LOG_FAIL_ALARM 行首正则与日志行首匹配失败,无法对日志做分行。 检查行首正则正确性,如果是单行日志可以配置为.*。 MULTI_CONFIG_MATCH_ALARM 同一个文件,只能被一个Logtail的配置收集,不支持同时被多个Logtail配置收集。 说明 Docker标准输出可以被多个Logtail配置采集。 检查一个文件是否在多个配置中被收集,并删除多余的配置。 REGEX_MATCH_ALARM 正则表达式解析模式下,日志内容和正则表达式不匹配。 复制错误内容中的日志样例重新尝试匹配,并生成新的解析正则式。 PARSE_LOG_FAIL_ALARM JSON、分隔符等解析模式下,由于日志格式不符合定义而解析失败。 请单击错误信息,查看匹配失败的详细报错。 CATEGORY_CONFIG_ALARM Logtail采集配置不合法。 常见的错误为正则表达式提取文件路径作为Topic失败,其它错误请提工单解决。 LOGTAIL_CRASH_ALARM Logtail因超过服务器资源使用上限而崩溃。 请参考配置启动参数修改CPU、内存使用上限,如有疑问请提工单。 REGISTER_INOTIFY_FAIL_ALARM Linux下注册日志监听失败,可能由于没有文件夹权限或文件夹被删除。 检查Logtail是否有权限访问该文件夹或该文件夹是否被删除。 DISCARD_DATA_ALARM 配置Logtail使用的CPU资源不够或网络发送流控。 请参考配置启动参数修改CPU使用上限或网络发送并发限制,如有疑问请提工单解决。 SEND_DATA_FAIL_ALARM 主账号未创建任何AccessKey。 Logtail客户端机器与日志服务的服务器端无法连通或者网络链路质量较差。 服务器端写入配额不足。 主账号创建AK。 检查本地配置文件/usr/local/ilogtail/ilogtail_config.json,执行curl <服务器地址>,查看是否有内容返回。 为Logstore增加Shard数目,以支持更大数据量的写入。 REGISTER_INOTIFY_FAIL_ALARM Logtail为日志目录注册的inotify watcher失败。 请检查目录是否存在以及目录权限设置。 SEND_QUOTA_EXCEED_ALARM 日志写入流量超出限制。 在控制台扩容分区。 READ_LOG_DELAY_ALARM 日志采集进度落后于日志产生进度,一般是由于配置Logtail使用的CPU资源不够或是网络发送流控导致。 请参考Logtail配置启动参数修改CPU使用上限或网络发送并发限制,如有疑问请提工单。 DROP_LOG_ALARM 日志采集进度落后于日志产生进度,且未处理的日志轮转超过20个,一般是由于配置Logtail使用的CPU资源不够或是网络发送流控导致。 请参考Logtail配置启动参数修改CPU使用上限或网络发送并发限制,如有疑问请提工单。 LOGDIR_PERMINSSION_ALARM 没有日志监控目录读取权限。 请检查日志监控目录是否存在,若存在请检查目录权限设置。 ENCODING_CONVERT_ALARM 编码转换失败。 请检查日志编码格式配置是否与日志编码格式一致。 OUTDATED_LOG_ALARM 过期的日志,日志时间落后超过12小时。可能原因: 日志解析进度落后超过12小时。 用户自定义时间字段配置错误。 日志记录程序时间输出异常。 查看是否存在READ_LOG_DELAY_ALARM。如存在按照READ_LOG_DELAY_ALARM处理方式解决,若不存在请检查时间字段配置。 检查时间字段配置。若时间字段配置正确,请检查日志记录程序时间输出是否正常。 如有疑问请提工单。 STAT_LIMIT_ALARM 日志采集配置目录中的文件数超限。 检查采集配置目录是否有较多的文件和子目录,合理设置监控的根目录和目录最大监控深度。 DROP_DATA_ALARM 进程退出时日志落盘到本地超时,此时会丢弃未落盘完毕的日志。 该报错通常为采集严重阻塞导致,请参考Logtail配置启动参数修改CPU使用上限或网络发送并发限制,如有疑问请提工单。 INPUT_COLLECT_ALARM 输入源采集异常。 请参考错误提示处理。 HTTP_LOAD_ADDRESS_ALARM http输入的address不合法。 请检查address合法性。 HTTP_COLLECT_ALARM http采集异常。 请根据错误提示排查,一般由于超时导致。 FILTER_INIT_ALARM 过滤器初始化异常。 一般由于过滤器的正则表达式非法导致,请根据提示修复。 INPUT_CANAL_ALARM MySQL binlog运行异常。 请根据错误提示排查。在配置更新时canal服务可能重启,服务重启的错误可以忽略。 CANAL_INVALID_ALARM MySQL binlog内部状态异常。 此错误一般由于运行时表的schema信息变更导致meta不一致,请确认报错期间是否在修改表的schema。其他情况请提工单。 MYSQL_INIT_ALARM MySQL初始化异常。 请参考错误提示处理。 MYSQL_CHECKPOING_ALARM MySQL checkpoint格式异常。 请确认是否修改该配置中的checkpoint相关配置,其他情况请提工单。 MYSQL_TIMEOUT_ALARM MySQL查询超时。 请确认MySQL服务器和网络是否异常。 MYSQL_PARSE_ALARM MySQL查询结果解析失败。 请确认MySQL配置的checkpoint格式是否匹配对应字段的格式。 AGGREGATOR_ADD_ALARM 向队列中添加数据失败。 这种情况是由于数据发送过快,若真实数据量很大,则无需关心。 ANCHOR_FIND_ALARM anchor插件错误、配置错误或存在不符合配置的日志。 请单击错误查看详细报错,报错根据内容分为以下几类,请根据详细报错中的信息,检查相应的配置是否存在问题。 anchor cannot find key:配置中指定了SourceKey但日志中不存在对应的字段。 anchor no start:无法从SourceKey的值中找到Start对应的内容。 anchor no stop:无法从 SourceKey 的值中找到Stop对应的内容。 ANCHOR_JSON_ALARM anchor插件错误,对已配置的Start和Stop所确定的内容执行JSON展开时发生错误。 请单击错误查看详细报错,检查所处理的内容以及相关的配置,确定是否有配置错误或不合法日志。 CANAL_RUNTIME_ALARM binlog插件运行时错误。 请单击错误查看详细报错,根据错误信息进行进一步地排查,错误一般与所连接的MySQL master相关。 CHECKPOINT_INVALID_ALARM 插件内Checkpoint解析失败。 请单击错误查看详细报错,根据其中的检查点键、检查点内容(前 1024 个字节)以及具体的错误信息进行进一步排查。 DIR_EXCEED_LIMIT_ALARM Logtail同时监听的目录数超出限制。 检查当前Logstore的采集配置以及该Logtail上应用的其他配置是否会包含较多的目录数,合理设置监控的根目录和目录最大监控深度。 DOCKER_FILE_MAPPING_ALARM 执行Logtail命令添加Docker文件映射失败。 请单击错误查看详细报错,根据其中的命令以及具体的错误信息进行进一步排查。 DOCKER_FILE_MATCH_ALARM 无法在Docker容器中查找到指定文件。 请单击错误查看详细报错,根据其中的容器信息以及查找的文件路径进行进一步排查。 DOCKER_REGEX_COMPILE_ALARM docker stdout插件错误,根据配置中的BeginLineRegex构建正则表达式失败。 请单击错误查看详细报错,检查其中的正则表达式是否正确。 DOCKER_STDOUT_INIT_ALARM docker stdout采集初始化失败。 请单击错误查看详细报错,报错根据内容分为以下几类: host...version...error:请检查配置中指定的Docker engine是否可访问。 load checkpoint error:加载检查点失败,如无影响可忽略此错误。 container...:指定容器存在非法label值,目前仅允许配置stdout和stderr。请结合详细错误进行检查。 DOCKER_STDOUT_START_ALARM Docker stdout初始化采集时,stdout文件大小超过限制。 一般由于首次采集时stdout文件已存在,可忽略。 DOCKER_STDOUT_STAT_ALARM Docker stdout无法检查到stdout文件。 一般由于容器退出时无法访问到文件,可忽略。 FILE_READER_EXCEED_ALARM Logtail同时打开的文件对象数量超过限制。 一般由于当前处于采集状态的文件数过多,请检查采集配置是否合理。 GEOIP_ALARM geoip插件错误。 请单击错误查看详细报错,报错根据内容分为以下几类: invalid ip...:获取IP地址失败,请检查配置中的 SourceKey 是否正确或是否存在不合法日志。 parse ip...:根据IP地址解析城市失败,请查看详细错误信息进行排查。 cannot find key...:无法从日志中查看到指定的SourceKey,请检查配置是否正确或是否存在不合法日志。 HTTP_INIT_ALARM http插件错误,配置中指定的ResponseStringMatch正则表达式编译错误。 请单击错误查看详细报错,检查其中的正则表达式是否正确。 HTTP_PARSE_ALARM http插件错误,获取HTTP响应失败。 请单击错误查看详细报错,根据其中的具体错误信息对配置内容或所请求的HTTP服务器进行检查。 INIT_CHECKPOINT_ALARM binlog插件错误,加载检查点失败,插件将忽略检查点并从头开始处理。 请单击错误查看详细报错,根据其中的具体错误信息来确定是否可忽略此错误。 LOAD_LOCAL_EVENT_ALARM Logtail执行了本地事件处理。 此警告一般不会出现,如果非人为操作引起此警告,才需要进行错误排查。请单击错误查看详细报错,根据其中的文件名、配置名、project、logstore等信息进行进一步地排查。 LOG_REGEX_FIND_ALARM processor_split_log_regex以及 processor_split_log_string插件错误,无法从日志中获取到配置中指定的 SplitKey。 请单击错误查看详细报错,检查是否存在配置错误的情况。 LUMBER_CONNECTION_ALARM service_lumberjack插件错误,停止插件时关闭服务器错误。 请单击错误查看详细报错,根据其中的具体错误信息进行进一步排查,此错误一般可忽略。 LUMBER_LISTEN_ALARM service_lumberjack插件错误,初始化进行监听时发生错误。 请单击错误查看详细报错,报错根据内容分为以下几类: init tls error...:请结合具体的错误信息检查 TLS 相关的配置是否正确 listen init error...:请结合具体的错误信息检查地址相关的配置是否正确。 LZ4_COMPRESS_FAIL_ALARM Logtail执行LZ4压缩发生错误。 请单击错误查看详细报错,根据其中的log lines、project、category、region等值来进行进一步排查。 MYSQL_CHECKPOINT_ALARM MySQL插件错误,检查点相关错误。 请单击错误查看详细报错,报错根据内容分为以下几类: init checkpoint error...:初始化检查点失败,请根据错误信息检查配置指定的检查点列以及所获取的值是否正确。 not matched checkpoint...:检查点信息不匹配,请根据错误信息检查是否是由于配置更新等人为原因导致的错误,如果是则可忽略。 NGINX_STATUS_COLLECT_ALARM nginx_status插件错误,获取状态发生错误。 请单击错误查看详细报错,根据其中的URL以及具体的错误信息来进行进一步排查。 NGINX_STATUS_INIT_ALARM nginx_status插件错误,初始化解析配置中指定的URL失败。 请单击错误查看详细报错,根据其中的URL检查地址是否正确配置。 OPEN_FILE_LIMIT_ALARM Logtail已打开文件数量超过限制,无法打开新的文件。 请单击错误查看详细报错,根据其中的日志文件路径、Project、Logstore等信息进行进一步排查。 OPEN_LOGFILE_FAIL_ALARM Logtail打开文件出错。 请单击错误查看详细报错,根据其中的日志文件路径、Project、Logstore等信息进行进一步排查。 PARSE_DOCKER_LINE_ALARM service_docker_stdout插件错误,解析日志失败。 请单击错误查看详细报错,报错根据内容分为以下几类: parse docker line error: empty line:日志为空。 parse json docker line error...:以JSON格式解析日志失败,请根据错误信息以及日志的前512个字节进行排查。 parse cri docker line error...:以CRI格式解析日志失败,请根据错误信息以及日志的前512个字节进行排查。 PLUGIN_ALARM 插件初始化及相关调用发生错误。 请单击错误查看详细报错,报错根据内容分为以下几类,请根据具体的错误信息进行进一步排查。 init plugin error...:初始化插件失败。 hold on error...:暂停插件运行失败。 resume error...:恢复插件运行失败。 start service error...:启动 service input类型的插件失败。 stop service error...:停止 service input类型的插件失败。 PROCESSOR_INIT_ALARM regex插件错误,编译配置中指定的Regex正则表达式失败。 请单击错误查看详细报错,检查其中的正则表达式是否正确。 PROCESS_TOO_SLOW_ALARM Logtail日志解析速度过慢。 单击错误查看详细报错,根据其中的日志数量、缓冲区大小、解析时间来确定是否正常。 如果不正常,检查Logtail所在节点是否有其他进程占用了过多的CPU资源或是存在效率较低的正则表达式等不合理的解析配置。 REDIS_PARSE_ADDRESS_ALARM redis插件错误,配置中提供的ServerUrls存在解析失败的情况。 请单击错误查看详细报错,对其中报错的URL进行检查。 REGEX_FIND_ALARM regex 插件错误,无法从日志中找到配置中SourceKey指定的字段。 请单击错误查看详细报错,检查是否存在SourceKey配置错误或日志不合法的情况。 REGEX_UNMATCHED_ALARM regex插件错误,匹配失败。 请单击错误查看详细报错,报错根据内容分为以下几类,请根据具体的错误信息进行进一步地排查,例如检查配置是否正确。 unmatch this log content...:日志无法匹配配置中的正则表达式 match result count less...:匹配的结果数量少于配置中指定的 Keys 数量。 SAME_CONFIG_ALARM 同一个Logstore下存在同名的配置,后发现的配置会被抛弃。 请单击错误查看详细报错,根据其中的配置路径等信息排查是否存在配置错误的情况。 SPLIT_FIND_ALARM split_char以及split_string插件错误,无法从日志中找到配置中SourceKey指定的字段。 请单击错误查看详细报错,检查是否存在SourceKey配置错误或日志不合法的情况。 SPLIT_LOG_ALARM processor_split_char以及processor_split_string插件错误,解析得到的字段数量与SplitKeys中指定的不相同。 请单击错误查看详细报错,检查是否存在SourceKey配置错误或日志不合法的情况。 STAT_FILE_ALARM 插件内通过LogFileReader对象进行文件采集时发生错误。 请单击错误查看详细报错,根据其中的文件路径、错误信息进行进一步排查。 SERVICE_SYSLOG_INIT_ALARM service_syslog插件错误,初始化失败。 请单击错误查看详细报错,检查配置中的Address是否正确。 SERVICE_SYSLOG_STREAM_ALARM service_syslog插件错误,通过TCP采集时发生错误。 请单击错误查看详细报错,报错根据内容分为以下几类,请根据详细报错中的具体错误信息进行排查。 accept error...:执行Accept时发生错误,插件将等待一段时间后重试。 setKeepAlive error...:设置 Keep Alive失败,插件将跳过此错误并继续运行。 connection i/o timeout...:通过TCP读取时超时,插件将重设超时并继续读取。 scan error...:TCP 读取错误,插件将等待一段时间后重试。 SERVICE_SYSLOG_PACKET_ALARM service_syslog插件错误,通过UDP采集时发生错误。 请单击错误查看详细报错,报错根据内容分为以下几类,请根据详细报错中的具体错误信息进行排查。 connection i/o timeout...:通过UDP读取时超时,插件将重设超时并继续读取。 read from error...:UDP读取错误,插件将等待一段时间后重试。
保持可爱mmm 2020-03-26 23:02:18 0 浏览量 回答数 0

回答

概述 视频上传到视频点播(VOD),并且转码成功后即可进行播放,可以在视频点播控制台的视频管理页面对视频进行预览播放,也可集成VOD播放器SDK,或者将获取到的视频播放地址传递给自己的播放器(系统原生或开源或自研)来播放视频。本文由阿里云视频云高级开发工程师筱巶撰写,主要介绍视频点播播放的前置条件以及用户在使用过程中经常遇到的问题,便于用户快速的定位并解决播放相关的问题。正式使用点播播放服务前需确认以下流程的配置及处理正确无误: 服务开通 视频处理 安全配置 网络环境 2. 服务开通 2.1 点播服务开通 在 阿里云视频点播产品页 点击【立即开通】。 若无阿里云账号请先 注册;若未完成实名认证,请参考 实名认证 进行操作。 点播帐号未欠费。关于欠费请参考 欠费说明。 2.2 域名配置 在 视频点播控制台 添加备案过的域名,过程参考 初始化设置。 域名获取:域名注册、转入或购买请移步 万网,可在 万网域名管理页面选择需要使用的域名。 域名配置:获得域名后需要进行CNAME绑定才能完成接入,请参考 万网域名接入,同时也支持 新网和 DNSPod的域名接入。 域名检测:在Linux命令行、Mac的Terminal或Windows的CMD命令行输入:nslookup -type=cname[用户点播域名] Linux(如CentOS)下若提示“command not found”则需要先安装:yum install bind-utils -y 如果显示的canonical name值与点播控制台显示的CNAME值一致则表示配置成功。 结果参考:https://help.aliyun.com/knowledge_detail/40173.html https://help.aliyun.com/knowledge_detail/40144.html CDN的IP检测页面:https://cdn.console.aliyun.com/home#/Tool/ip 视频处理 视频文件上传至点播帐号下,经过视频处理流程后才可用于播放。根据业务需要,用户可以选择普通转码和上传后直接分发加速两种处理方式。用户上传的源文件必须是多媒体文件,需要满足特定文件格式和编码的要求才可以转码成功,最终用于播放。 3.1 文件有效 源文件和输出文件格式和编码限制参考文档 https://help.aliyun.com/knowledge_detail/42250.html 如果用户的视频选择的是上传后直接分发加速的处理方式,点播需要对该视频进行截图处理和CDN分发加速,那么为了保障源文件分发后是默认可播放的,则视频源文件仅限于上传mp4、flv格式的文件。 当用户上传的源文件不符合视频处理要求时,会导致文件转码失败,目前转码失败的原因大部分是由于上传的源文件视频流缺失或Meta存在问题导致的,因此用户在上传文件前需要确认源文件能否在本地正常播放。 3.2 转码配置 在 转码设置中选择转码模板组,点播服务开通时默认会添加不转码即分发和系统模板组,配置参考 转码配置。进入转码流程处理时会根据转码配置转出相应格式和清晰度的文件用于播放。当视频选择不转码即分发模板组时,源文件上传完成后即可用于播放。 3.3 视频状态 视频处理成功后且只有视频状态为Normal的视频才能用于播放。为了快速获取可播放的视频,用户可以通过状态轮询和事件通知两种方式确定当前视频是否可以播放。状态轮询的方式时间上不可预期,建议用户根据视频处理的方式设置不同的事件通知: 普通转码,只要有一个清晰度转码完成后即可播放,可以配置: 单个清晰度转码完成事件 全部转码完成事件 不转码即分发,视频上传完成后即可播放,可以配置: 视频上传完成事件 在点播控制台的 回调设置中配置相应的事件通知,配置参考 事件通知。 安全配置正确 阿里云视频点播提供了完善的内容安全保护机制,可以满足不同业务场景的安全需求,但如果安全配置不当,也会导致用户视频无法播放的问题。 4.1 审核配置 在 审核设置 中可以配置审核流程,只有审核通过的视频才可用于播放,配置参考 审核设置。 在"审核设置"开启了"先审后发"才会出现状态为Checking的视频 在"视频点播控制台-视频审核-审核详情"中点击"屏蔽"或者调用审核接口对视频进行屏蔽操作后才会出现状态为Blocked的视频 状态为Checking和Blocked状态的视频只能在点播控制台内或者来自审核IP白名单内的请求才可播放。 4.2 访问限制 在 防盗链中配置访问的 Referer黑、白名单(二者互斥)来限制视频资源被访问的情况。符合规则可顺利请求到视频数据,若不符合,请求会被拒绝,并返回403响应码。配置参考 防盗链设置。 4.3 URL鉴权 播放地址若固定不变会带来持久的非法扩散传播,且无法有效遏制。视频点播提供的URL鉴权可通过生成动态的加密URL(包含权限验证、过期时效等信息)来区分合法请求,以达到保护视频资源的目的。在 URL鉴权 可配置URL鉴权信息,配置参考 URL鉴权配置 开启URL鉴权后,点播的播放器SDK、获取播放地址的API/SDK都会自动生成带时效的播放URL。 开启URL鉴权后,所有媒体资源,包括视频、音频、封面、截图等地址都会进行鉴权。 当开启URL鉴权后,只有在有效期内的URL才可以播放,URL鉴权过期后请求会被拒绝,并返回403响应码。 4.4 视频加密 阿里云视频加密是对视频数据加密,即使下载到本地,视频本身也是被加密的,无法恶意二次分发。如果用户在配置转码模板时选择了HLS加密,相应的转码输出文件只能通过集成阿里云播放器SDK播放。目前播放器内核SDK,涵盖iOS/Android/Flash多平台,自动对加密内容进行解密播放;H5播放器不支持加密视频的播放。 更多信息参考 阿里云-视频加密 网络环境 播放服务强依赖于网络环境,如果没有稳定畅通的网络环境,会严重影响播放服务质量甚至无法播放视频。当网络出现异常时,可以参考以下两种网络排查方法: 5.1 域名劫持检查 访问 https://www.ipip.net/ip.html 默认显示的是本地IP 用户本地PING一下要访问的域名,看是否能解析出对应的IP 查看解析出的IP是否是阿里云CDN的节点,在 https://www.ipip.net/ip.html 中输入IP会显示相应地区 如果不是阿里云CDN节点的IP,那么说明被劫持的,建议向客户端访问所在网络运营商进行投诉。 5.2 源站检查 如果通过域名解析出的IP是阿里云CDN的节点IP,且能PING通域名,那么本地域名绑定host测试,看下是CDN问题还是源站问题。具体操作步骤请参考 CDN访问异常。 常见问题 上传和播放服务均无法使用时,请确认点播帐号是否欠费 控制台内可播放,调用API/SDK获取播放地址时返回错误码InvalidDomain.NotFound,请确认域名配置 调用API/SDK获取播放地址时返回错误Forbidden.IllegalStatus,请确认视频状态 调用API/SDK获取播放地址时返回错误码InvalidVideo.NotFound,请确认视频是否被删除 当请求CDN加速地址返回403时,请确认安全配置 当某个地区用户无法播放视频时,请检查用户网络环境 使用点播Web端播放器诊断页面的输出信息定位播放问题。目前支持原生H5、阿里云H5/Flash播放。诊断页面地址: http://player.alicdn.com/detection.html?source=http://common.qupai.me/player/qupai.mp4 原文链接
游客2q7uranxketok 2021-02-07 20:08:31 0 浏览量 回答数 0

回答

概述 视频上传到视频点播(VOD),并且转码成功后即可进行播放,可以在视频点播控制台的视频管理页面对视频进行预览播放,也可集成VOD播放器SDK,或者将获取到的视频播放地址传递给自己的播放器(系统原生或开源或自研)来播放视频。本文由阿里云视频云高级开发工程师筱巶撰写,主要介绍视频点播播放的前置条件以及用户在使用过程中经常遇到的问题,便于用户快速的定位并解决播放相关的问题。正式使用点播播放服务前需确认以下流程的配置及处理正确无误: 服务开通 视频处理 安全配置 网络环境 2. 服务开通 2.1 点播服务开通 在 阿里云视频点播产品页 点击【立即开通】。 若无阿里云账号请先 注册;若未完成实名认证,请参考 实名认证 进行操作。 点播帐号未欠费。关于欠费请参考 欠费说明。 2.2 域名配置 在 视频点播控制台 添加备案过的域名,过程参考 初始化设置。 域名获取:域名注册、转入或购买请移步 万网,可在 万网域名管理页面选择需要使用的域名。 域名配置:获得域名后需要进行CNAME绑定才能完成接入,请参考 万网域名接入,同时也支持 新网和 DNSPod的域名接入。 域名检测:在Linux命令行、Mac的Terminal或Windows的CMD命令行输入:nslookup -type=cname[用户点播域名] Linux(如CentOS)下若提示“command not found”则需要先安装:yum install bind-utils -y 如果显示的canonical name值与点播控制台显示的CNAME值一致则表示配置成功。 结果参考:https://help.aliyun.com/knowledge_detail/40173.html https://help.aliyun.com/knowledge_detail/40144.html CDN的IP检测页面:https://cdn.console.aliyun.com/home#/Tool/ip 视频处理 视频文件上传至点播帐号下,经过视频处理流程后才可用于播放。根据业务需要,用户可以选择普通转码和上传后直接分发加速两种处理方式。用户上传的源文件必须是多媒体文件,需要满足特定文件格式和编码的要求才可以转码成功,最终用于播放。 3.1 文件有效 源文件和输出文件格式和编码限制参考文档 https://help.aliyun.com/knowledge_detail/42250.html 如果用户的视频选择的是上传后直接分发加速的处理方式,点播需要对该视频进行截图处理和CDN分发加速,那么为了保障源文件分发后是默认可播放的,则视频源文件仅限于上传mp4、flv格式的文件。 当用户上传的源文件不符合视频处理要求时,会导致文件转码失败,目前转码失败的原因大部分是由于上传的源文件视频流缺失或Meta存在问题导致的,因此用户在上传文件前需要确认源文件能否在本地正常播放。 3.2 转码配置 在 转码设置中选择转码模板组,点播服务开通时默认会添加不转码即分发和系统模板组,配置参考 转码配置。进入转码流程处理时会根据转码配置转出相应格式和清晰度的文件用于播放。当视频选择不转码即分发模板组时,源文件上传完成后即可用于播放。 3.3 视频状态 视频处理成功后且只有视频状态为Normal的视频才能用于播放。为了快速获取可播放的视频,用户可以通过状态轮询和事件通知两种方式确定当前视频是否可以播放。状态轮询的方式时间上不可预期,建议用户根据视频处理的方式设置不同的事件通知: 普通转码,只要有一个清晰度转码完成后即可播放,可以配置: 单个清晰度转码完成事件 全部转码完成事件 不转码即分发,视频上传完成后即可播放,可以配置: 视频上传完成事件 在点播控制台的 回调设置中配置相应的事件通知,配置参考 事件通知。 安全配置正确 阿里云视频点播提供了完善的内容安全保护机制,可以满足不同业务场景的安全需求,但如果安全配置不当,也会导致用户视频无法播放的问题。 4.1 审核配置 在 审核设置 中可以配置审核流程,只有审核通过的视频才可用于播放,配置参考 审核设置。 在"审核设置"开启了"先审后发"才会出现状态为Checking的视频 在"视频点播控制台-视频审核-审核详情"中点击"屏蔽"或者调用审核接口对视频进行屏蔽操作后才会出现状态为Blocked的视频 状态为Checking和Blocked状态的视频只能在点播控制台内或者来自审核IP白名单内的请求才可播放。 4.2 访问限制 在 防盗链中配置访问的 Referer黑、白名单(二者互斥)来限制视频资源被访问的情况。符合规则可顺利请求到视频数据,若不符合,请求会被拒绝,并返回403响应码。配置参考 防盗链设置。 4.3 URL鉴权 播放地址若固定不变会带来持久的非法扩散传播,且无法有效遏制。视频点播提供的URL鉴权可通过生成动态的加密URL(包含权限验证、过期时效等信息)来区分合法请求,以达到保护视频资源的目的。在 URL鉴权 可配置URL鉴权信息,配置参考 URL鉴权配置 开启URL鉴权后,点播的播放器SDK、获取播放地址的API/SDK都会自动生成带时效的播放URL。 开启URL鉴权后,所有媒体资源,包括视频、音频、封面、截图等地址都会进行鉴权。 当开启URL鉴权后,只有在有效期内的URL才可以播放,URL鉴权过期后请求会被拒绝,并返回403响应码。 4.4 视频加密 阿里云视频加密是对视频数据加密,即使下载到本地,视频本身也是被加密的,无法恶意二次分发。如果用户在配置转码模板时选择了HLS加密,相应的转码输出文件只能通过集成阿里云播放器SDK播放。目前播放器内核SDK,涵盖iOS/Android/Flash多平台,自动对加密内容进行解密播放;H5播放器不支持加密视频的播放。 更多信息参考 阿里云-视频加密 网络环境 播放服务强依赖于网络环境,如果没有稳定畅通的网络环境,会严重影响播放服务质量甚至无法播放视频。当网络出现异常时,可以参考以下两种网络排查方法: 5.1 域名劫持检查 访问 https://www.ipip.net/ip.html 默认显示的是本地IP 用户本地PING一下要访问的域名,看是否能解析出对应的IP 查看解析出的IP是否是阿里云CDN的节点,在 https://www.ipip.net/ip.html 中输入IP会显示相应地区 如果不是阿里云CDN节点的IP,那么说明被劫持的,建议向客户端访问所在网络运营商进行投诉。 5.2 源站检查 如果通过域名解析出的IP是阿里云CDN的节点IP,且能PING通域名,那么本地域名绑定host测试,看下是CDN问题还是源站问题。具体操作步骤请参考 CDN访问异常。 常见问题 上传和播放服务均无法使用时,请确认点播帐号是否欠费 控制台内可播放,调用API/SDK获取播放地址时返回错误码InvalidDomain.NotFound,请确认域名配置 调用API/SDK获取播放地址时返回错误Forbidden.IllegalStatus,请确认视频状态 调用API/SDK获取播放地址时返回错误码InvalidVideo.NotFound,请确认视频是否被删除 当请求CDN加速地址返回403时,请确认安全配置 当某个地区用户无法播放视频时,请检查用户网络环境 使用点播Web端播放器诊断页面的输出信息定位播放问题。目前支持原生H5、阿里云H5/Flash播放。诊断页面地址: http://player.alicdn.com/detection.html?source=http://common.qupai.me/player/qupai.mp4 原文链接
游客2q7uranxketok 2021-02-07 20:08:30 0 浏览量 回答数 0

阿里云试用中心,为您提供0门槛上云实践机会!

100+款试用云产品,最长免费试用12个月!拨打95187-1,咨询专业上云建议!

回答

本文介绍AliSQL的内核版本更新说明。 MySQL 8.0 20200229 新特性 Performance Agent:更加便捷的性能数据统计方案。通过MySQL插件的方式,实现MySQL实例内部各项性能数据的采集与统计。 在半同步模式下添加网络往返时间,并记录到性能数据。 性能优化 允许在只读实例上进行语句级并发控制(CCL)操作。 备实例支持Outline。 Proxy短连接优化。 优化不同CPU架构下的pause指令执行时间。 添加内存表查看线程池运行情况。 Bug修复 在低于4.9的Linux Kenerls中禁用ppoll,使用poll代替。 修复wrap_sm4_encrypt函数调用错误问题。 修复在滚动审核日志时持有全局变量锁的问题。 修复恢复不一致性检查的问题。 修复io_statistics表出现错误time值的问题。 修复无效压缩算法导致崩溃的问题。 修复用户列与5.6不兼容的问题。 20200110 新特性 Inventory Hint:新增了三个hint, 支持SELECT、UPDATE、INSERT、DELETE 语句,快速提交/回滚事务,提高业务吞吐能力。 性能优化 启动实例时,先初始化Concurrency Control队列结构,再初始化Concurrency Control规则。 异步清除文件时继续取消小文件的链接。 优化Thread Pool性能。 默认情况下禁用恢复不一致性检查。 更改设置变量所需的权限: 设置以下变量所需的权限已更改为普通用户权限: auto_increment_increment auto_increment_offset bulk_insert_buffer_size binlog_rows_query_log_events 设置以下变量所需的权限已更改为超级用户或系统变量管理用户权限: binlog_format binlog_row_image binlog_direct sql_log_off sql_log_bin 20191225 新特性 Recycle Bin:临时将删除的表转移到回收站,还可以设置保留的时间,方便您找回数据。 性能优化 提高短连接处理性能。 使用专用线程为maintain user服务,避免HA失败。 通过Redo刷新Binlog时出现错误会显式释放文件同步锁。 删除不必要的TCP错误日志。 默认情况下启用线程池。 Bug修复 修复慢日志刷新的问题。 修复锁定范围不正确的问题。 修复TDE的Select函数导致的核心转储问题。 20191115 新特性 Statement Queue:针对语句的排队机制,将语句进行分桶排队,尽量把可能具有相同冲突的语句放在一个桶内排队,减少冲突的开销。 20191101 新特性 为TDE添加SM4加密算法。 保护备实例信息:拥有SUPER或REPLICATION_SLAVE_ADMIN权限的用户才能插入/删除/修改表slave_master_info、slave_relay_log_info、slave_worker_info。 提高自动递增键的优先级:如果表中没有主键或非空唯一键,具有自动增量的非空键将是第一候选项。 对系统表和处于初始化状态线程用到的表,不进行Memory引擎到MyISAM引擎的自动转换。 Redo Log刷新到磁盘之前先将Binlog文件刷新到磁盘。 实例被锁定时也会影响临时表。 添加新的基于LSM树的事务存储引擎X-Engine。 性能优化 Thread Pool:互斥优化。 Performance Insight:性能点支持线程池。 参数调整: primary_fast_lookup:会话参数,默认值为true。 thread_pool_enabled:全局参数,默认值为true。 20191015 新特性 TDE:支持透明数据加密TDE(Transparent Data Encryption)功能,可对数据文件执行实时I/O加密和解密,数据在写入磁盘之前进行加密,从磁盘读入内存时进行解密。 Returning:Returning功能支持DML语句返回Resultset,同时提供了工具包(DBMS_TRANS)便于您快捷使用。 强制将引擎从MyISAM/MEMORY转换为InnoDB:如果全局变量force_memory/mysiam_to_innodb为ON,则创建/修改表时会将表引擎从MyISAM/MEMORY转换为InnoDB。 禁止非高权限账号切换主备实例。 性能代理插件:收集性能数据并保存到本地格式化文本文件,采用文件轮循方式,保留最近的秒级性能数据。 Innodb mutex timeout cofigurable:可配置全局变量innodb_fatal_semaphore_wait_threshold,默认值:600。 忽略索引提示错误:可配置全局变量ignore_index_hint_error,默认值:false。 可关闭SSL加密功能。 TCP错误信息:返回TCP方向(读取、读取等待、写入等待)错误及错误代码到end_connection事件,并且输出错误信息到错误日志。 Bug修复 支持本地AIO的Linux系统内,在触发线性预读之前会合并AIO请求。 优化表/索引统计信息。 如果指定了主键,则直接访问主索引。 20190915 Bug修复 修复Cmd_set_current_connection内存泄露问题。 20190816 新特性 Thread Pool:将线程和会话分离,在拥有大量会话的同时,只需要少量线程完成活跃会话的任务即可。 Statement Concurrency Control:通过控制并发数应对突发的数据库请求流量、资源消耗过高的语句访问以及SQL访问模型的变化,保证MySQL实例持续稳定运行。 Statement Outline:利用Optimizer Hint和Index Hint让MySQL稳定执行计划。 Sequence Engine:简化获取序列值的复杂度。 Purge Large File Asynchronously:删除单个表空间时,会将表空间文件重命名为临时文件,等待异步清除进程清理临时文件。 Performance Insight:专注于实例负载监控、关联分析、性能调优的利器,帮助您迅速评估数据库负载,找到性能问题的源头,提升数据库的稳定性。 优化实例锁状态:实例锁定状态下,可以drop或truncate表。 Bug修复 修复文件大小计算错误的问题。 修复偶尔出现的内存空闲后再次使用的问题。 修复主机缓存大小为0时的崩溃问题。 修复隐式主键与CTS语句的冲突问题。 修复慢查询导致的slog出错问题。 20190601 性能优化 缩短日志表MDL范围,减少MDL阻塞的可能性。 重构终止选项的代码。 Bug修复 修复审计日志中没有记录预编译语句的问题。 屏蔽无效表名的错误日志。 MySQL 5.7基础版/高可用版 20200229 新特性 Performance Agent:更加便捷的性能数据统计方案。通过MySQL插件的方式,实现MySQL实例内部各项性能数据的采集与统计。 在半同步模式下添加网络往返时间,并记录到性能数据。 性能优化 优化不同CPU架构下的pause指令执行时间。 Proxy短连接优化。 添加内存表查看线程池运行情况。 Bug修复 修复DDL重做日志不安全的问题。 修复io_statistics表出现错误time值的问题。 修复更改表导致服务器崩溃的问题。 修复MySQL测试用例。 20200110 性能优化 异步清除文件时继续取消小文件的链接。 优化Thread Pool性能。 thread_pool_enabled参数的默认值调整为OFF。 20191225 新特性 内部账户管理与防范:调整用户权限保护数据安全。 性能优化 提高短连接处理性能。 使用专用线程为maintain user服务,避免HA失败。 删除不必要的TCP错误日志。 优化线程池。 Bug修复 修复读写分离时mysqld进程崩溃问题。 修复密钥环引起的核心转储问题。 20191115 Bug修复 修复主备切换后审计日志显示变量的问题。 20191101 新特性 为TDE添加SM4加密算法。 如果指定了主键,则直接访问主索引。 对系统表和处于初始化状态线程用到的表,不进行Memory引擎到MyISAM引擎的自动转换。 性能优化 Thread Pool:互斥优化。 引入审计日志缓冲机制,提高审计日志的性能。 Performance Insight:性能点支持线程池。 默认开启Thread Pool。 Bug修复 在处理维护用户列表时释放锁。 补充更多TCP错误信息。 20191015 新特性 轮换慢日志:为了在收集慢查询日志时保证零数据丢失,轮换日志表会将慢日志表的csv数据文件重命名为唯一名称并创建新文件。您可以使用show variables like '%rotate_log_table%';查看是否开启轮换慢日志。 性能代理插件:收集性能数据并保存到本地格式化文本文件,采用文件轮轮循方式,保留最近的秒级性能数据。 强制将引擎从MEMORY转换为InnoDB:如果全局变量rds_force_memory_to_innodb为ON,则创建/修改表时会将表引擎从MEMORY转换为InnoDB。 TDE机制优化:添加keyring-rds插件与管控系统/密钥管理服务进行交互。 TCP错误信息:返回TCP方向(读取、读取等待、写入等待)错误及错误代码到end_connection事件,并且输出错误信息到错误日志。 Bug修复 修复DDL中的意外错误Error 1290。 20190925 参数修改 将系统变量auto_generate_certs的默认值由true改为false。 增加全局只读变量auto_detact_certs,默认值为false,有效值为[true | false]。 该系统变量在Server端使用OpenSSL编译时可用,用于控制Server端在启动时是否在数据目录下自动查找SSL加密证书和密钥文件,即控制是否开启Server端的证书和密钥的自动查找功能。 20190915 新特性 Thread Pool:将线程和会话分离,在拥有大量会话的同时,只需要少量线程完成活跃会话的任务即可。 20190815 新特性 Purge Large File Asynchronously:删除单个表空间时,会将表空间文件重命名为临时文件,等待异步清除进程清理临时文件。 Performance Insight:专注于实例负载监控、关联分析、性能调优的利器,帮助您迅速评估数据库负载,找到性能问题的源头,提升数据库的稳定性。 优化实例锁状态:实例锁定状态下,可以drop或truncate表。 Bug修复 禁止在set rds_current_connection命令中设置rds_prepare_begin_id。 允许更改已锁定用户的信息。 禁止用关键字actual作为表名。 修复慢日志导致时间字段溢出的问题。 20190510版本 新特性:允许在事务内创建临时表。 20190319版本 新特性:支持在handshake报文内代理设置threadID。 20190131版本 升级到官方5.7.25版本。 关闭内存管理功能jemalloc。 修复内部变量net_lenth_size计算错误问题。 20181226版本 新特性:支持动态修改binlog-row-event-max-size,加速无主键表的复制。 修复Proxy实例内存申请异常的问题。 20181010版本 支持隐式主键。 加快无主键表的主备复制。 支持Native AIO,提升I/O性能。 20180431版本 新特性: 支持高可用版。 支持SQL审计。 增强对处于快照备份状态的实例的保护。 MySQL 5.7三节点企业版 20191128 新特性 支持读写分离。 Bug修复 修复部分场景下Follower Second_Behind_Master计算错误问题。 修复表级并行复制事务重试时死锁问题。 修复XA相关bug。 20191016 新特性 支持MySQL 5.7高可用版(本地SSD盘)升级到三节点企业版。 兼容MySQL官方GTID功能,默认不开启。 合并AliSQL MySQL 5.7基础版/高可用版 20190915版本及之前的自研功能。 Bug修复 修复重置备实例导致binlog被关闭问题。 20190909 新特性 优化大事务在三节点强一致状态下的执行效率。 支持从Leader/Follower进行Binlog转储。 支持创建只读实例。 系统表默认使用InnoDB引擎。 Bug修复 修复Follower日志清理命令失效问题。 修复参数slave_sql_verify_checksum=OFF和binlog_checksum=crc32时Slave线程异常退出问题。 20190709 新特性 支持三节点功能。 禁用semi-sync插件。 支持表级并行复制、Writeset并行复制。 支持pk_access主键查询加速。 支持线程池。 合并AliSQL MySQL 5.7基础版/高可用版 20190510版本及之前的自研功能。 MySQL 5.6 20200229 新特性 支持Proxy读写分离功能。 性能优化 优化线程池功能。 优化不同CPU架构下的pause指令执行时间。 Bug修复 修复XA事务部分提交的问题。 20200110 新特性 Thread Pool:将线程和会话分离,在拥有大量会话的同时,只需要少量线程完成活跃会话的任务即可。 性能优化 异步清除文件时继续取消小文件的链接。 Bug修复 修复页面清理程序的睡眠时间计算不正确问题。 修复SELECT @@global.gtid_executed导致的故障转移失败问题。 修复IF CLIENT KILLED AFTER ROLLBACK TO SAVEPOINT PREVIOUS STMTS COMMITTED问题。 20191212 性能优化 删除不必要的tcp错误日志 20191115 Bug修复 修复慢日志时间戳溢出问题。 20191101 Bug修复 修复刷新日志时切换慢日志的问题,仅在执行刷新慢日志时切换慢日志。 修正部分显示错误。 20191015 新特性 轮换慢日志:为了在收集慢查询日志时保证零数据丢失,轮换日志表会将慢日志表的csv数据文件重命名为唯一名称并创建新文件。您可以使用show variables like '%rotate_log_table%';查看是否开启轮换慢日志。 SM4加密算法:添加新的SM4加密算法,取代旧的SM加密算法。 Purge Large File Asynchronously:删除单个表空间时,会将表空间文件重命名为临时文件,等待异步清除进程清理临时文件。 TCP错误信息:返回TCP方向(读取、读取等待、写入等待)错误及错误代码到end_connection事件,并且输出错误信息到错误日志。 引入审计日志缓冲机制,提高审计日志的性能。。 Bug修复 禁用pstack,避免存在大量连接时可能导致pstack无响应。 修复隐式主键与create table as select语句之间的冲突。 自动清除由二进制日志创建的临时文件。 20190815 优化实例锁状态:实例锁定状态下,可以drop或truncate表。 20190130版本 修复部分可能导致系统不稳定的bug。 20181010版本 添加参数rocksdb_ddl_commit_in_the_middle(MyRocks)。如果这个参数被打开,部分DDL在执行过程中将会执行commit操作。 201806** (5.6.16)版本 新特性:slow log精度提升为微秒。 20180426(5.6.16)版本 新特性:引入隐藏索引,支持将索引设置为不可见,详情请参见参考文档。 修复备库apply线程的bug。 修复备库apply分区表更新时性能下降问题。 修复TokuDB下alter table comment重建整张表问题,详情请参见参考文档。 修复由show slave status/show status可能触发的死锁问题。 20171205(5.6.16)版本 修复OPTIMIZE TABLE和ONLINE ALTER TABLE同时执行时会触发死锁的问题。 修复SEQUENCE与隐含主键冲突的问题。 修复SHOW CREATE SEQUENCE问题。 修复TokuDB引擎的表统计信息错误。 修复并行OPTIMIZE表引入的死锁问题。 修复QUERY_LOG_EVENT中记录的字符集问题。 修复信号处理引起的数据库无法停止问题,详情请参见参考文档。 修复RESET MASTER引入的问题。 修复备库陷入等待的问题。 修复SHOW CREATE TABLE可能触发的进程崩溃问题。 20170927(5.6.16)版本 修复TokuDB表查询时使用错误索引问题。 20170901(5.6.16)版本 新特性: 升级SSL加密版本到TLS 1.2,详情请参见参考文档。 支持Sequence。 修复NOT IN查询在特定场景下返回结果集有误的问题。 20170530 (5.6.16)版本 新特性:支持高权限账号Kill其他账号下的连接。 20170221(5.6.16)版本 新特性:支持读写分离简介。 MySQL 5.5 20181212 修复调用系统函数gettimeofday(2) 返回值不准确的问题。该系统函数返回值为时间,常用来计算等待超时,时间不准确时会导致一些操作永不超时。
游客yl2rjx5yxwcam 2020-03-08 13:18:55 0 浏览量 回答数 0

回答

) 抽象语法树 在计算机科学中,抽象语法树(Abstract Syntax Tree,AST),或简称语法树(Syntax tree),是源代码语法结构的一种抽象表示。它以树状的形式表现编程语言的语法结构,树上的每个节点都表示源代码中的一种结构。 之所以说语法是“抽象”的,是因为这里的语法并不会表示出真实语法中出现的每个细节。比如,嵌套括号被隐含在树的结构中,并没有以节点的形式呈现。而类似于 if else 这样的条件判断语句,可以使用带有两个分支的节点来表示。 以算术表达式 1+3*(4-1)+2 为例,可以解析出的抽象语法树如下图所示: 抽象语法树 图:抽象语法树 抽象语法树可以应用在很多领域,比如浏览器,智能编辑器,编译器。 2) 静态单赋值 在编译器设计中,静态单赋值形式(static single assignment form,通常简写为 SSA form 或是 SSA)是中介码(IR,intermediate representation)的属性,它要求每个变量只分配一次,并且变量需要在使用之前定义。在实践中我们通常会用添加下标的方式实现每个变量只能被赋值一次的特性,这里以下面的代码举一个简单的例子: x := 1 x := 2 y := x 从上面的描述所知,第一行赋值行为是不需要的,因为 x 在第二行被二度赋值并在第三行被使用,在 SSA 下,将会变成下列的形式: x1 := 1 x2 := 2 y1 := x2 从使用 SSA 的中间代码我们就可以非常清晰地看出变量 y1 的值和 x1 是完全没有任何关系的,所以在机器码生成时其实就可以省略第一步,这样就能减少需要执行的指令来优化这一段代码。 根据 Wikipedia(维基百科)对 SSA 的介绍来看,在中间代码中使用 SSA 的特性能够为整个程序实现以下的优化: 常数传播(constant propagation) 值域传播(value range propagation) 稀疏有条件的常数传播(sparse conditional constant propagation) 消除无用的程式码(dead code elimination) 全域数值编号(global value numbering) 消除部分的冗余(partial redundancy elimination) 强度折减(strength reduction) 寄存器分配(register allocation) 因为 SSA 的主要作用就是代码的优化,所以是编译器后端(主要负责目标代码的优化和生成)的一部分。当然,除了 SSA 之外代码编译领域还有非常多的中间代码优化方法,优化编译器生成的代码是一个非常古老并且复杂的领域,这里就不展开介绍了。 3) 指令集架构 最后要介绍的一个预备知识就是指令集架构了,指令集架构(Instruction Set Architecture,简称 ISA),又称指令集或指令集体系,是计算机体系结构中与程序设计有关的部分,包含了基本数据类型,指令集,寄存器,寻址模式,存储体系,中断,异常处理以及外部 I/O。指令集架构包含一系列的 opcode 即操作码(机器语言),以及由特定处理器执行的基本命令。 指令集架构常见种类如下: 复杂指令集运算(Complex Instruction Set Computing,简称 CISC); 精简指令集运算(Reduced Instruction Set Computing,简称 RISC); 显式并行指令集运算(Explicitly Parallel Instruction Computing,简称 EPIC); 超长指令字指令集运算(VLIW)。 不同的处理器(CPU)使用了大不相同的机器语言,所以我们的程序想要在不同的机器上运行,就需要将源代码根据架构编译成不同的机器语言。 编译原理 Go语言编译器的源代码在 cmd/compile 目录中,目录下的文件共同构成了Go语言的编译器,学过编译原理的人可能听说过编译器的前端和后端,编译器的前端一般承担着词法分析、语法分析、类型检查和中间代码生成几部分工作,而编译器后端主要负责目标代码的生成和优化,也就是将中间代码翻译成目标机器能够运行的机器码。 Go的编译器在逻辑上可以被分成四个阶段:词法与语法分析、类型检查和 AST 转换、通用 SSA 生成和最后的机器代码生成,下面我们来分别介绍一下这四个阶段做的工作。 1) 词法与语法分析 所有的编译过程其实都是从解析代码的源文件开始的,词法分析的作用就是解析源代码文件,它将文件中的字符串序列转换成 Token 序列,方便后面的处理和解析,我们一般会把执行词法分析的程序称为词法解析器(lexer)。 而语法分析的输入就是词法分析器输出的 Token 序列,这些序列会按照顺序被语法分析器进行解析,语法的解析过程就是将词法分析生成的 Token 按照语言定义好的文法(Grammar)自下而上或者自上而下的进行规约,每一个 Go 的源代码文件最终会被归纳成一个 SourceFile 结构: SourceFile = PackageClause ";" { ImportDecl ";" } { TopLevelDecl ";" } 标准的 Golang 语法解析器使用的就是 LALR(1) 的文法,语法解析的结果其实就是上面介绍过的抽象语法树(AST),每一个 AST 都对应着一个单独的Go语言文件,这个抽象语法树中包括当前文件属于的包名、定义的常量、结构体和函数等。 如果在语法解析的过程中发生了任何语法错误,都会被语法解析器发现并将消息打印到标准输出上,整个编译过程也会随着错误的出现而被中止。 2) 类型检查 当拿到一组文件的抽象语法树 AST 之后,Go语言的编译器会对语法树中定义和使用的类型进行检查,类型检查分别会按照顺序对不同类型的节点进行验证,按照以下的顺序进行处理: 常量、类型和函数名及类型; 变量的赋值和初始化; 函数和闭包的主体; 哈希键值对的类型; 导入函数体; 外部的声明; 通过对每一棵抽象节点树的遍历,我们在每一个节点上都会对当前子树的类型进行验证保证当前节点上不会出现类型错误的问题,所有的类型错误和不匹配都会在这一个阶段被发现和暴露出来。 类型检查的阶段不止会对树状结构的节点进行验证,同时也会对一些内建的函数进行展开和改写,例如 make 关键字在这个阶段会根据子树的结构被替换成 makeslice 或者 makechan 等函数。 其实类型检查不止对类型进行了验证工作,还对 AST 进行了改写以及处理Go语言内置的关键字,所以,这一过程在整个编译流程中是非常重要的,没有这个步骤很多关键字其实就没有办法工作。 3) 中间代码生成 当我们将源文件转换成了抽象语法树,对整个语法树的语法进行解析并进行类型检查之后,就可以认为当前文件中的代码基本上不存在无法编译或者语法错误的问题了,Go语言的编译器就会将输入的 AST 转换成中间代码。 Go语言编译器的中间代码使用了 SSA(Static Single Assignment Form) 的特性,如果我们在中间代码生成的过程中使用这种特性,就能够比较容易的分析出代码中的无用变量和片段并对代码进行优化。 在类型检查之后,就会通过一个名为 compileFunctions 的函数开始对整个Go语言项目中的全部函数进行编译,这些函数会在一个编译队列中等待几个后端工作协程的消费,这些 Goroutine 会将所有函数对应的 AST 转换成使用 SSA 特性的中间代码。 4) 机器码生成 Go语言源代码的 cmd/compile/internal 目录中包含了非常多机器码生成相关的包,不同类型的 CPU 分别使用了不同的包进行生成 amd64、arm、arm64、mips、mips64、ppc64、s390x、x86 和 wasm,也就是说Go语言能够在几乎全部常见的 CPU 指令集类型上运行。
游客2q7uranxketok 2021-02-20 14:42:25 0 浏览量 回答数 0

回答

1.字符串转义序列转义字符 描述(在行尾时) 续行符\ 反斜杠符号' 单引号" 双引号a 响铃b 退格(Backspace)e 转义000 空n 换行v 纵向制表符t 横向制表符r 回车f 换页oyy 八进制数yy代表的字符,例如:o12代表换行xyy 十进制数yy代表的字符,例如:x0a代表换行other 其它的字符以普通格式输出 2.字符串格式化 3.操作符 一、算术运算符 注意: 双斜杠 // 除法总是向下取整。 从符点数到整数的转换可能会舍入也可能截断,建议使用math.floor()和math.ceil()明确定义的转换。 Python定义pow(0, 0)和0 ** 0等于1。 二、比较运算符 运算符 描述< 小于<= 小于或等于 大于= 大于或等于== 等于 != 不等于is 判断两个标识符是不是引用自一个对象is not 判断两个标识符是不是引用自不同对象注意: 八个比较运算符优先级相同。 Python允许x < y <= z这样的链式比较,它相当于x < y and y <= z。 复数不能进行大小比较,只能比较是否相等。 三、逻辑运算符 运算符 描述 备注x or y if x is false, then y, elsex x andy if x is false, then x, elsey not x if x is false, then True,elseFalse 注意: or是个短路运算符,它只有在第一个运算数为False时才会计算第二个运算数的值。 and也是个短路运算符,它只有在第一个运算数为True时才会计算第二个运算数的值。 not的优先级比其他类型的运算符低,所以not a == b相当于not (a == b),而 a == not b是错误的。 四、位运算符 运算符 描述 备注x | y 按位或运算符 x ^ y 按位异或运算符 x & y 按位与运算符 x << n 左移动运算符 x >> n 右移动运算符 ~x 按位取反运算符 五、赋值运算符 复合赋值运算符与算术运算符是一一对应的: 六、成员运算符 Python提供了成员运算符,测试一个元素是否在一个序列(Sequence)中。 运算符 描述in 如果在指定的序列中找到值返回True,否则返回False。not in 如果在指定的序列中没有找到值返回True,否则返回False。 4.关键字总结 Python中的关键字包括如下: and del from not while as elif global or with assert else if pass yield break except import print class exec in raise continue finally is return def for lambda try你想看看有哪些关键字?OK,打开一个终端,就像这样~ long@zhouyl:~$ pythonPython 2.7.3 (default, Jan 2 2013, 16:53:07) [GCC 4.7.2] on linux2Type "help", "copyright", "credits" or "license" for more information. import keywordkeyword.kwlist ['and', 'as', 'assert', 'break', 'class', 'continue', 'def', 'del', 'elif', 'else', 'except', 'exec', 'finally', 'for', 'from', 'global', 'if', 'import', 'in', 'is', 'lambda', 'not', 'or', 'pass', 'print', 'raise', 'return', 'try', 'while', 'with', 'yield'] ============================== 华丽的 正文分隔符 ======================================== 看到这些关键字你还能记得多少?你不妨自己一个一个对照想想它的用法,下面是我总结的,我根据前面的学习笔记将上述关键字分为以下几类: 1.判断、循环 对于Python的循环及判断主要包括这些关键字: if elif else for while break continue and or is not in 这几个关键字在前面介绍 if 语法、while语法、for语法以及and...or语法中已有介绍,下面再一笔带过: 1.1 if 语法 if语法与C语言、shell脚本之下的非常类似,最大的区别就是冒号以及严格的缩进,当然这两点也是Python区别于其他语言的地方: if condition1: do something elif condition2: do another thing else: also do something 1.2 while 语法 Python的while语法区别于C、shell下的while除了冒号及缩进之外,还有一点就是while可以携带一个可选的else语句: while condition: do something else: do something 注:else语句是可选的,但是使用while语句时一定要注意判断语句可以跳出! 1.3 for 语法 与while类似,Python的for循环也包括一个可选的else语句(跳出for循环时执行,但是如果是从break语句跳出则不执行else语句块中的代码!),而且for 加上 关键字in就组成了最常见的列表解析用法(以后会写个专门的博客)。 下面是for的一般用法: for i in range(1,10,2): do something if condition: break else: do something for的列表解析用法: for items in list: print items 1.4 and...or 语法 Python的and/or操作与其他语言不同的是它的返回值是参与判断的两个值之一,所以我们可以通过这个特性来实现Python下的 a ? b : c ! 有C语言基础的知道 “ a ? b : c ! ” 语法是判断 a,如果正确则执行b,否则执行 c! 而Python下我们可以这么用:“ a and b or c ”(此方法中必须保证b必须是True值),python自左向右执行此句,先判断a and b :如果a是True值,a and b语句仍需要执行b,而此时b是True值!所以a and b的值是b,而此时a and b or c就变成了b or c,因b是True值,所以b or c的结果也是b;如果a是False值,a and b语句的结果就是a,此时 a and b or c就转化为a or c,因为此时a是 False值,所以不管c是True 还是Flase,a or c的结果就是c!!!捋通逻辑的话,a and b or c 是不是就是Python下的a ? b : c ! 用法? 1.5 is ,not is 和 is not 是Python下判断同一性的关键字,通常用来判断 是 True 、False或者None(Python下的NULL)! 比如 if alue is True : ... (不记得本节的童鞋罚复习:python 学习笔记 2 -- 判断语句) 2.函数、模块、类 对于Python的函数及模块主要包括这些关键字: from import as def pass lambda return class 那么你还能记得它们么?下面简单介绍一下: 2.1 模块 Python的编程通常大量使用标准库中的模块,使用方法就是使用import 、from以及as 关键字。 比如: import sys # 导入sys模块 from sys import argv # 从sys模块中导入argv ,这个在前面介绍脚本传参数时使用到 import cPickle as p # 将cPickle模块导入并在此将它简单命名为p,此后直接可以使用p替代cPickle模块原名,这个在介绍文件输入输出时的存储器中使用到 2.2 函数 Python中定义函数时使用到def关键字,如果你当前不想写入真实的函数操作,可以使用pass关键字指代不做任何操作: def JustAFunction: pass 当然,在需要给函数返回值时就用到了return关键字,这里简单提一下Python下的函数返回值可以是多个(接收返回值时用相应数量的变量接收!)! 此外Python下有个神奇的Lambda函数,它允许你定义单行的最小函数,这是从Lisp中借用来的,可以用在任何需要函数的地方。比如: g = lambda x : x*2 # 定义一个Lambda函数用来计算参数的2倍并返回! print g(2) # 使用时使用lambda函数返回的变量作为这个函数的函数名,括号中带入相应参数即可! (不记得本节的童鞋罚复习:python 学习笔记 4 -- 函数篇) 3.异常 对于Python的异常主要包括这些关键字: try except finally raise 异常这一节还是比较简单的,将可能出现的异常放在 try: 后面的语句块中,使用except关键字捕获一定的异常并在接下来的语句块中做相应操作,而finally中接的是无论出现什么异常总在执行最后做finally: 后面的语句块(比如关闭文件等必要的操作!) raise关键字是在一定的情况下引发异常,通常结合自定义的异常类型使用。 (不记得本节的童鞋罚复习:python 学习笔记 6 -- 异常处理) 4.其他 上面的三类过后,还剩下这些关键字: print del global with assert yield exec 首先print 在前面的笔记或者任何地方你都能见到,所以还是比较熟悉的,此处就不多介绍了!del 关键字在前面的笔记中已有所涉及,比如删除列表中的某项,我们使用 “ del mylist[0] ” 可能这些剩下来的关键字你比较陌生,所以下面来介绍一下: 4.1.global 关键字 当你在函数定义内声明变量的时候,它们与函数外具有相同名称的其他变量没有任何关系,即变量名称对于函数来说是 局部 的。这称为变量的 作用域 。所有变量的作用域是它们被定义的块,从它们的名称被定义的那点开始。 eg. ? 1 2 3 4 5 6 7 8 9 10 11 !/usr/bin/python Filename: func_local.py def func(x): print'x is', x x = 2 print'Changed local x to', x x = 50 func(x) print'x is still', x 运行的结果是这样的:? 1 2 3 4 $ python func_local.py x is 50 # 运行func函数时,先打印x的值,此时带的值是作为参数带入的外部定义的50,所以能正常打印 x=50 Changed local x to 2 # 在func函数中将x赋2,并打印 x is still 50 # 运行完func函数,打印x的值,此时x的值仍然是之前赋给的50,而不是func函数中修改过的2,因为在函数中修改的只是函数内的局部变量 那么为什么我们要在这提到局部变量呢?bingo,聪明的你一下就猜到这个global就是用来定义全局变量的。也就是说如果你想要为一个在函数外定义的变量赋值,那么你就得告诉Python这个变量名不是局部的,而是 全局 的。我们使用global语句完成这一功能。没有global语句,是不可能为定义在函数外的变量赋值的。eg.? 1 2 3 4 5 6 7 8 9 10 11 12 !/usr/bin/python Filename: func_global.py def func(): global x print'x is', x x = 2 print'Changed local x to', x x = 50 func() print'Value of x is', x 运行的结果是这样的:? 1 2 3 4 $ python func_global.py x is 50 Changed global x to 2 Value of x is 2 # global语句被用来声明x是全局的——因此,当我们在函数内把值赋给x的时候,这个变化也反映在我们在主块中使用x的值的时候。 你可以使用同一个global语句指定多个全局变量。例如global x, y, z。 4.2.with 关键字 有一些任务,可能事先需要设置,事后做清理工作。对于这种场景,Python的with语句提供了一种非常方便的处理方式。一个很好的例子是文件处理,你需要获取一个文件句柄,从文件中读取数据,然后关闭文件句柄。如果不用with语句,打开一个文件并读文件的代码如下:? 1 2 3 file = open("/tmp/foo.txt") data = file.read() file.close() 当然这样直接打开有两个问题:一是可能忘记关闭文件句柄;二是文件读取数据发生异常,没有进行任何处理。下面是添加上异常处理的版本:? 1 2 3 4 5 file = open("/tmp/foo.txt") try: data = file.read() finally: file.close() 虽然这段代码运行良好,但是太冗余了。这时候就是with一展身手的时候了。除了有更优雅的语法,with还可以很好的处理上下文环境产生的异常。下面是with版本的代码:? 1 2 with open("/tmp/foo.txt") as file: data = file.read() 这看起来充满魔法,但不仅仅是魔法,Python对with的处理还很聪明。基本思想是with所求值的对象必须有一个__enter__()方法,一个__exit__()方法。with语句的执行逻辑如下:紧跟with后面的语句被求值后,返回对象的__enter__()方法被调用,这个方法的返回值将被赋值给as后面的变量。当with后面的代码块全部被执行完之后,将调用前面返回对象的__exit__()方法。 下面例子可以具体说明with如何工作:? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 !/usr/bin/python with_example01.py classSample: def __enter__(self): print"In __enter__()" return"Foo" def __exit__(self, type, value, trace): print"In __exit__()" def get_sample(): returnSample() with get_sample() as sample: print"sample:", sample 运行代码,输出如下? 1 2 3 4 $python with_example01.py In __enter__() # __enter__()方法被执行 sample: Foo # __enter__()方法返回的值 - 这个例子中是"Foo",赋值给变量'sample',执行代码块,打印变量"sample"的值为"Foo" In __exit__() # __exit__()方法被调用 4.3.assert 关键字 assert语句是一种插入调试断点到程序的一种便捷的方式。assert语句用来声明某个条件是真的,当assert语句失败的时候,会引发一AssertionError,所以结合try...except我们就可以处理这样的异常。 mylist # 此时mylist是有三个元素的列表['a', 'b', 'c']assert len(mylist) is not None # 用assert判断列表不为空,正确无返回assert len(mylist) is None # 用assert判断列表为空 Traceback (most recent call last): File "", line 1, in AssertionError # 引发AssertionError异常 4.4.yield 关键字 我们先看一个示例:? 1 2 3 4 5 6 7 8 def fab(max): n, a, b = 0,0,1 whilen < max: yield b # print b a, b = b, a + b n = n + 1 ''' 使用这个函数:? 1 2 3 4 5 6 7 8 forn in fab(5): ... print n ... 1 1 2 3 5 简单地讲,yield 的作用就是把一个函数变成一个 generator(生成器),带有 yield 的函数不再是一个普通函数,Python 解释器会将其视为一个 generator,调用 fab(5) 不会执行 fab 函数,而是返回一个 iterable(可迭代的)对象!在 for 循环执行时,每次循环都会执行 fab 函数内部的代码,执行到 yield b 时,fab 函数就返回一个迭代值,下次迭代时,代码从 yield b 的下一条语句继续执行,而函数的本地变量看起来和上次中断执行前是完全一样的,于是函数继续执行,直到再次遇到 yield。也可以手动调用 fab(5) 的 next() 方法(因为 fab(5) 是一个 generator 对象,该对象具有 next() 方法),这样我们就可以更清楚地看到 fab 的执行流程:? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 f = fab(5) f.next() 1 f.next() 1 f.next() 2 f.next() 3 f.next() 5 f.next() Traceback (most recent call last): File"", line 1, in StopIteration 当函数执行结束时,generator 自动抛出 StopIteration 异常,表示迭代完成。在 for 循环里,无需处理 StopIteration 异常,循环会正常结束。 我们可以得出以下结论:一个带有 yield 的函数就是一个 generator,它和普通函数不同,生成一个 generator 看起来像函数调用,但不会执行任何函数代码,直到对其调用 next()(在 for 循环中会自动调用 next())才开始执行。虽然执行流程仍按函数的流程执行,但每执行到一个 yield 语句就会中断,并返回一个迭代值,下次执行时从 yield 的下一个语句继续执行。看起来就好像一个函数在正常执行的过程中被 yield 中断了数次,每次中断都会通过 yield 返回当前的迭代值。 yield 的好处是显而易见的,把一个函数改写为一个 generator 就获得了迭代能力,比起用类的实例保存状态来计算下一个 next() 的值,不仅代码简洁,而且执行流程异常清晰。 注:如果看完此段你还未明白yield,没问题,因为yield是初学者的一个难点,那么你下一步需要做的就是……看一看下面参考资料中给的关于yield的博文! 4.5.exec 关键字 官方文档对于exec的解释: "This statement supports dynamic execution of Python code."也就是说使用exec可以动态执行Python代码(也可以是文件)。? 1 2 3 4 5 6 7 8 9 10 11 12 13 longer = "print "Hello World ,my name is longer"" # 比如说我们定义了一个字符串 longer 'print "Hello World ,my name is longer"' exec(longer) # 使用exec 动态执行字符串中的代码 Hello World ,my name is longer exec(sayhi) # 使用exec直接打开文件名(指定sayhi,sayhi.py以及"sayhi.py"都会报一定的错,但是我觉得直接带sayhi报错非常典型) Traceback (most recent call last): File"", line 1, in TypeError: exec: arg 1must be a string, file, or code object # python IDE报错,提示exec的第一个参 数必须是一个字符串、文件或者一个代码对象 f = file("sayhi.py") # 使用file打开sayhi.py并创建f实例 exec(f) # 使用exec直接运行文件描述符f,运行正常!! Hi,thisis [''] script 上述给的例子比较简单,注意例子中exec语句的用法和eval_r(), execfile()是不一样的. exec是一个关键字(要不然我怎么会在这里介绍呢~~~), 而eval_r()和execfile()则是内建函数。更多关于exec的使用请详看引用资料或者Google之 在需要在字符中使用特殊字符时,python用反斜杠()转义字符。 原始字符串 有时我们并不想让转义字符生效,我们只想显示字符串原来的意思,这就要用r和R来定义原始字符串。如: print r’tr’ 实际输出为“tr”。 转义字符 描述 (在行尾时) 续行符 反斜杠符号 ’ 单引号 ” 双引号 a 响铃 b 退格(Backspace) e 转义 000 空 n 换行 v 纵向制表符 t 横向制表符 r 回车 f 换页 oyy 八进制数yy代表的字符,例如:o12代表换行 xyy 十进制数yy代表的字符,例如:x0a代表换行 other 其它的字符以普通格式输出
xuning715 2019-12-02 01:10:21 0 浏览量 回答数 0

回答

1.内存泄漏:基础 对于初学者来说,将内存泄漏视为一种疾病,将Java的OutOfMemoryError(简称OOM)视为一种症状。但与任何疾病一样,并非所有OOM都意味着内存泄漏:由于生成大量局部变量或其他此类事件,OOM可能会发生。另一方面,并非所有内存泄漏都必然表现为OOM,特别是在桌面应用程序或客户端应用程序(没有重新启动时运行很长时间)的情况下。 将内存泄漏视为疾病,将OutOfMemoryError视为症状。但并非所有OutOfMemoryErrors都意味着内存泄漏,并非所有内存泄漏都表现为OutOfMemoryErrors。 为什么这些泄漏如此糟糕?除此之外,程序执行期间泄漏的内存块通常会降低系统性能,因为分配但未使用的内存块必须在系统耗尽空闲物理内存时进行换出。最终,程序甚至可能耗尽其可用的虚拟地址空间,从而导致OOM。 2.解密OutOfMemoryError 如上所述,OOM是内存泄漏的常见指示。实质上,当没有足够的空间来分配新对象时,会抛出错误。当垃圾收集器找不到必要的空间,并且堆不能进一步扩展,会多次尝试。因此,会出现错误以及堆栈跟踪。 诊断OOM的第一步是确定错误的实际含义。这听起来很清除,但答案并不总是那么清晰。例如:OOM是否是因为Java堆已满而出现,还是因为本机堆已满?为了帮助您回答这个问题,让我们分析一些可能的错误消息: java.lang.OutOfMemoryError: Java heap space java.lang.OutOfMemoryError: PermGen space java.lang.OutOfMemoryError: Requested array size exceeds VM limit java.lang.OutOfMemoryError: request bytes for . Out of swap space? java.lang.OutOfMemoryError: (Native method) 2.1.“Java heap space” 此错误消息不一定意味着内存泄漏。实际上,问题可能与配置问题一样简单。 例如,我负责分析一直产生这种类型的OutOfMemoryError的应用程序。经过一番调查后,我发现罪魁祸首是阵列实例化,因为需要太多的内存;在这种情况下,并不是应用程序的错,而是应用程序服务器依赖于默认的堆太小了。我通过调整JVM的内存参数解决了这个问题。 在其他情况下,特别是对于长期存在的应用程序,该消息可能表明我们无意中持有对象的引用,从而阻止垃圾收集器清理它们。这时Java语言等同于内存泄漏。 (注意:应用程序调用的API也可能无意中持有对象引用。) 这些“Java堆空间”OOM的另一个潜在来源是使用finalizers。如果类具有finalize方法,则在垃圾收集时该类型的对象不会被回收。而是在垃圾收集之后,稍后对象将排队等待最终确定。在Sun实现中,finalizers由守护线程执行。如果finalizers线程无法跟上finalization队列,那么Java堆可能会填满并且可能抛出OOM。 2.2.“PermGen space” 此错误消息表明永久代已满。永久代是存储类和方法对象的堆的区域。如果应用程序加载了大量类,则可能需要使用-XX:MaxPermSize选项增加永久代的大小。 Interned java.lang.String对象也存储在永久代中。 java.lang.String类维护一个字符串池。调用实习方法时,该方法检查池以查看是否存在等效字符串。如果是这样,它由实习方法返回;如果没有,则将字符串添加到池中。更准确地说,java.lang.String.intern方法返回一个字符串的规范表示;结果是对该字符串显示为文字时将返回的同一个类实例的引用。如果应用程序实例化大量字符串,则可能需要增加永久代的大小。 注意:您可以使用jmap -permgen命令打印与永久生成相关的统计信息,包括有关内部化String实例的信息。 2.3.“Requested array size exceeds VM limit” 此错误表示应用程序(或该应用程序使用的API)尝试分配大于堆大小的数组。例如,如果应用程序尝试分配512MB的数组但最大堆大小为256MB,则将抛出此错误消息的OOM。在大多数情况下,问题是配置问题或应用程序尝试分配海量数组时导致的错误。 2.4.“Request bytes for . Out of swap space?” 此消息似乎是一个OOM。但是,当本机堆的分配失败并且本机堆可能将被耗尽时,HotSpot VM会抛出此异常。消息中包括失败请求的大小(以字节为单位)以及内存请求的原因。在大多数情况下,是报告分配失败的源模块的名称。 如果抛出此类型的OOM,则可能需要在操作系统上使用故障排除实用程序来进一步诊断问题。在某些情况下,问题甚至可能与应用程序无关。例如,您可能会在以下情况下看到此错误: 操作系统配置的交换空间不足。 系统上的另一个进程是消耗所有可用的内存资源。 由于本机泄漏,应用程序也可能失败(例如,如果某些应用程序或库代码不断分配内存但无法将其释放到操作系统)。 2.5. (Native method) 如果您看到此错误消息并且堆栈跟踪的顶部框架是本机方法,则该本机方法遇到分配失败。此消息与上一个消息之间的区别在于,在JNI或本机方法中检测到Java内存分配失败,而不是在Java VM代码中检测到。 如果抛出此类型的OOM,您可能需要在操作系统上使用实用程序来进一步诊断问题。 2.6.Application Crash Without OOM 有时,应用程序可能会在从本机堆分配失败后很快崩溃。如果您运行的本机代码不检查内存分配函数返回的错误,则会发生这种情况。 例如,如果没有可用内存,malloc系统调用将返回NULL。如果未检查malloc的返回,则应用程序在尝试访问无效的内存位置时可能会崩溃。根据具体情况,可能很难定位此类问题。 在某些情况下,致命错误日志或崩溃转储的信息就足以诊断问题。如果确定崩溃的原因是某些内存分配中缺少错误处理,那么您必须找到所述分配失败的原因。与任何其他本机堆问题一样,系统可能配置了但交换空间不足,另一个进程可能正在消耗所有可用内存资源等。 3.泄漏诊断 在大多数情况下,诊断内存泄漏需要非常详细地了解相关应用程序。警告:该过程可能很长并且是迭代的。 我们寻找内存泄漏的策略将相对简单: 识别症状 启用详细垃圾回收 启用分析 分析踪迹 3.1 识别症状 正如所讨论的,在许多情况下,Java进程最终会抛出一个OOM运行时异常,这是一个明确的指示,表明您的内存资源已经耗尽。在这种情况下,您需要区分正常的内存耗尽和泄漏。分析OOM的消息并尝试根据上面提供的讨论找到罪魁祸首。 通常,如果Java应用程序请求的存储空间超过运行时堆提供的存储空间,则可能是由于设计不佳导致的。例如,如果应用程序创建映像的多个副本或将文件加载到数组中,则当映像或文件非常大时,它将耗尽存储空间。这是正常的资源耗尽。该应用程序按设计工作(虽然这种设计显然是愚蠢的)。 但是,如果应用程序在处理相同类型的数据时稳定地增加其内存利用率,则可能会发生内存泄漏。 3.2 启用详细垃圾收集 断言确实存在内存泄漏的最快方法之一是启用详细垃圾回收。通常可以通过检查verbosegc输出中的模式来识别内存约束问题。 具体来说,-verbosegc参数允许您在每次垃圾收集(GC)过程开始时生成跟踪。也就是说,当内存被垃圾收集时,摘要报告会打印到标准错误,让您了解内存的管理方式。 这是使用-verbosegc选项生成的一些典型输出: image 此GC跟踪文件中的每个块(或节)按递增顺序编号。要理解这种跟踪,您应该查看连续的分配失败节,并查找随着时间的推移而减少的释放内存(字节和百分比),同时总内存(此处,19725304)正在增加。这些是内存耗尽的典型迹象。 3.3 启用分析 不同的JVM提供了生成跟踪文件以反映堆活动的不同方法,这些方法通常包括有关对象类型和大小的详细信息。这称为分析堆。 3.4 分析路径 本文重点介绍Java VisualVM生成的跟踪。跟踪可以有不同的格式,因为它们可以由不同的Java内存泄漏检测工具生成,但它们背后的想法总是相同的:在堆中找到不应该存在的对象块,并确定这些对象是否累积而不是释放。特别感兴趣的是每次在Java应用程序中触发某个事件时已知的临时对象。应该仅存少量,但存在许多对象实例,通常表示应用程序出现错误。 最后,解决内存泄漏需要您彻底检查代码。了解对象泄漏的类型可能对此非常有用,并且可以大大加快调试速度。 4.垃圾收集如何在JVM中运行? 在我们开始分析具有内存泄漏问题的应用程序之前,让我们首先看看垃圾收集在JVM中的工作原理。 JVM使用一种称为跟踪收集器的垃圾收集器,它基本上通过暂停它周围的世界来操作,标记所有根对象(由运行线程直接引用的对象),并遵循它们的引用,标记它沿途看到的每个对象。 Java基于分代假设-实现了一种称为分代垃圾收集器的东西,该假设表明创建的大多数对象被快速丢弃,而未快速收集的对象可能会存在一段时间。 基于此假设,[Java将对象分为多代](www.oracle.com/technetwork…. Generations|outline)。这是一个视觉解释: image Young Generation -这是对象的开始。它有两个子代 Eden Space -对象从这里开始。大多数物体都是在Eden Space中创造和销毁的。在这里,GC执行Minor GCs,这是优化的垃圾收集。执行Minor GC时,对仍然需要的对象的任何引用都将迁移到其中一个survivors空间(S0或S1)。 Survivor Space (S0 and S1)-幸存Eden Space的对象最终来到这里。其中有两个,在任何给定时间只有一个正在使用(除非我们有严重的内存泄漏)。一个被指定为空,另一个被指定为活动,与每个GC循环交替。 Tenured Generation -也被称为老年代(图2中的旧空间),这个空间容纳存活较长的对象,使用寿命更长(如果它们活得足够长,则从Survivor空间移过来)。填充此空间时,GC会执行完整GC,这会在性能方面降低成本。如果此空间无限制地增长,则JVM将抛出OutOfMemoryError - Java堆空间。 Permanent Generation -作为与终身代密切相关的第三代,永久代是特殊的,因为它保存虚拟机所需的数据,以描述在Java语言级别上没有等价的对象。例如,描述类和方法的对象存储在永久代中。 Java足够聪明,可以为每一代应用不同的垃圾收集方法。使用名为Parallel New Collector的跟踪复制收集器处理年轻代。这个收集器阻止了这个世界,但由于年轻一代通常很小,所以暂停很短暂。 有关JVM代及其工作原理的更多信息,请查阅Memory Management in the Java HotSpot™ Virtual Machine 。 5 检测内存泄漏 要查找内存泄漏并消除它们,您需要合适的内存泄漏工具。是时候使用Java VisualVM检测并删除此类泄漏。 5.1 使用Java VisualVM远程分析堆 VisualVM是一种工具,它提供了一个可视化界面,用于查看有关基于Java技术的应用程序运行时的详细信息。 使用VisualVM,您可以查看与本地应用程序和远程主机上运行的应用程序相关的数据。您还可以捕获有关JVM软件实例的数据,并将数据保存到本地系统。 为了从Java VisualVM的所有功能中受益,您应该运行Java平台标准版(Java SE)版本6或更高版本。 Related: Why You Need to Upgrade to Java 8 Already 5.2. 为JVM启用远程连接 在生产环境中,通常很难访问运行代码的实际机器。幸运的是,我们可以远程分析我们的Java应用程序。 首先,我们需要在目标机器上授予自己JVM访问权限。为此,请使用以下内容创建名为jstatd.all.policy的文件: grant codebase "file:${java.home}/../lib/tools.jar" { permission java.security.AllPermission;
游客2q7uranxketok 2021-02-22 19:58:44 0 浏览量 回答数 0

问题

Web测试方法

在Web工程过程中,基于Web系统的测试、确认和验收是一项重要而富有挑战性的工作。基于Web的系统测试与传统的软件测试不同,它不但需要检查和验证是否按照设计的要求运行,而且还要测试系统在不同用户的浏...
技术小菜鸟 2019-12-01 21:41:32 7022 浏览量 回答数 1

问题

剖析短视频分发过程中的用户体验优化技术点

深圳云栖大会已经圆满落幕,在3月29日飞天技术汇-弹性计算、网络和CDN专场中,阿里云CDN高级技术专家周哲为我们带来了《海量短视频极速分发》的主题分享,带领我们从视频内容采集、上传、存储和分发的角...
樰篱 2019-12-01 21:50:09 2644 浏览量 回答数 0

回答

详细解答可以参考官方帮助文档首次接入推送不成功 1、遇到问题可以先通过文档页进行关键字检索,一般都能命中相关的疑问。2、检查推送通道是否初始化成功,确保您在初始化时注册的回调函数onSuccess能够被成功调用。3、如果推送通道初始化失败:请查看错误日志以及错误码,按照错误提醒检查appkey,appSecret等相关配置。4、如果发送的是消息,客户端不会通知栏弹出展示,需要客户端实现消息回调,自定义消息的展示方式。5、使用官方demo体验,,排除自身配置问题。使用官方demo时需要设置您自己的appKey,appSecret并修改包名。如果使用官方demo无问题,请确认下自己的实现和demo的区别。6、如果您的设备集成上阿里云移动推送Android SDK,端上日志显示初始化成功,控制台显示设备在线,但是总是推送失败,请检查以下参数是否符合规范: 请检查您的APP的versionName参数,versionName参数不能为null,同时长度不能超过32位。如果versionName参数不符合要求,请更改versionName参数。 修改后务必先卸载原有App然后重新安装,不要直接覆盖安装。 7、如果集成成功,向设备推送通知,排查系统显示已到达,但设备端并未弹窗显示。请确认推送的是通知还是消息,只有通知才会在通知栏创建通知,消息不会创建通知,需要用户在SDK端的onMessage接口中自行处理。8、推送消息,设备端日志显示已经收到推送,但用户回调未被调用。推送消息在端上的路由过程涉及到发送应用内广播,部分设备存在广播拦截,请确认您的设备是否存在该问题: 1.正常情况下的日志: 第一条handleRemoteMessage日志说明消息已经到达端上,第二条AgooMessageReceiver日志表明用户自定义Receiver已经接收到广播。 2.如果只有第一条日志,未出现第二条日志则说明receiver没有正常接收到广播,需要测试设备是否会拦截广播。测试代码如下: Intent intent = new Intent();intent.setAction("org.agoo.android.intent.action.RECEIVE");intent.setPackage(pack);//pack为应用包名intent.putExtra("type", "common-push");intent.addFlags(32);context.sendBroadcast(intent);//请使用ApplicationContext进行测试利用上述代码给您的自定义receiver发送广播,测试Receiver是否可以收到对应广播,如果还是收不到则说明存在广播拦截情况。 3.如果存在拦截情况,请确认你的设备是否不允许监听系统广播:在manifest.xml文件中将自定义receiver所监听的系统广播注释掉,具体操作如下文代码所示: <!-- 消息接收监听器 (用户可自主扩展) --> <receiver android:name=".demo.MyMessageReceiver" android:exported="true"> <intent-filter> <action android:name="com.alibaba.push2.action.NOTIFICATION_OPENED" /> </intent-filter> <intent-filter> <action android:name="com.alibaba.push2.action.NOTIFICATION_REMOVED" /> </intent-filter> <intent-filter> <action android:name="com.taobao.accs.intent.action.COMMAND" /> </intent-filter> <intent-filter> <action android:name="com.taobao.taobao.intent.action.COMMAND" /> </intent-filter> <intent-filter> <action android:name="org.agoo.android.intent.action.RECEIVE" /> </intent-filter> <!--<intent-filter>--> <!--<action android:name="android.net.conn.CONNECTIVITY_CHANGE" />--> <!--</intent-filter>--> <!--<intent-filter>--> <!--<action android:name="android.intent.action.USER_PRESENT" />--> <!--</intent-filter>--> <!--<intent-filter>--> <!--<action android:name="android.intent.action.BOOT_COMPLETED" />--> <!--</intent-filter>--> <!--<intent-filter>--> <!--<action android:name="android.intent.action.PACKAGE_REMOVED" />--> <!--<data android:scheme="package" />--> <!--</intent-filter>--> </receiver>重复步骤2的操作,观察是否会可以成功接收广播。如果可以则说明您的设备rom不允许监听系统广播。当前receiver不监听系统广播不影响功能的正常使用,但会影响SDK的保活能力。 9、- 设备绑定标签后,服务端按该标签推送,隔天(T + 1)才能生效送达,参考Android API介绍 - 标签API。 已经接入成功,突然出现异常 1、推送通知,如果有设备能收到,有设备不能收到,请检查不能收到通知设备的手机设置情况,是否将推送App的通知弹出做了限制。2、如果出现应用处于前台可以收到推送,应用退到后台后无法接收到推送。请检查channel进程是否执行了推送初始化操作。 1.判断channel是否执行初始化方法:查看channel进程是否有如下日志输出,如无则表示未执行相应初始化操作 12-26 11:26:19.673 1951-1951/com.alibaba.push2:channel I/SecurityBoxService: Aliyun12-26 11:26:19.677 1951-1951/com.alibaba.push2:channel I/MPS:CloudPushService: [AMS]Initialize Mobile Push service...12-26 11:26:19.727 1951-1951/com.alibaba.push2:channel D/MPS:CloudPushService: load utdid: Vs6CkGxR86QDANku3NiLD/yA12-26 11:26:19.743 1951-1951/com.alibaba.push2:channel D/MPS:AppRegister: getLooper called.12-26 11:26:19.744 1951-1989/com.alibaba.push2:channel D/MPS:AppRegister: Looping Prepared.12-26 11:26:19.744 1951-1989/com.alibaba.push2:channel D/MPS:AppRegister: Looping handleMessage: 112-26 11:26:19.747 1951-1989/com.alibaba.push2:channel D/MPS:AppRegister: accs init.12-26 11:26:19.747 1951-1989/com.alibaba.push2:channel D/MPS:AppRegister: initAccsChannel...12-26 11:26:19.748 1951-1989/com.alibaba.push2:channel I/MPS:AppRegister: [AMS]appkey:235528812.常见错误: (1) 用户在自定义Application中执行推送SDK初始化时做了进程判断,导致初始化操作只在主进程执行。错误代码如下所示: public class MyApplication extends Application { @override public void onCreate() { super.onCreate(); if(如果是主进程) { initCloudChannel(this); } } ......} (2) 用户在activity中进行相关初始化,activity只会在主进程创建,导致相关操作只能在主进程执行。错误代码如下所示: public class MyActivity extends Activity { @override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); initCloudChannel(getApplicationContext()); ...... } ......} 3、部分ROM对应用自动拉起管控较严格,如果您的设备是小米或者华为,且当前应用被杀死,建议配置小米和华为辅助通道以及小米托管弹窗,可以提升到达率。相关文档:小米/华为系统推送支持4、利用推送排查系统排错。排错方法:获取设备deviceId,对deviceId单独推送一条,在排查系统查看相关信息。如下图:5、如果推送排查页面显示未知错误,请确认测试设备是否关闭了推送通道即是否调用过turnOffPushChannel接口。如果是,必须再次调用turnOnPushChannel接口重新打开推送通道。6、用测试appKey测试正常,切换成正式appKey(测试appKey和正式appKey对应相同的包名)之后收不到推送。SDK在初始化过程中有本地请求缓存,更换appKey后需清理本地缓存或卸载测试app重新安装正式app。7、从V2.+版本升级到V3.+版本后接收不到推送。V2.+和V3.+版本在配置上有所区别,详细排查逻辑请参考:移动推送Android SDK:推送从2.+版本升级到3.+版本后,收不到通知/消息 问题仍未解决若上述步骤仍未能定位问题,可以: 加入钉钉群,群号:11795523。或者提交工单,工单请选择类目移动推送。 反馈问题时,请附带下述格式化的问题上下文信息,方便快速定位问题(带*项必填): 您的操作行为:异常的现象:设备的平台(Android?iOS?),机型,系统版本号:推送类型(消息?通知?):推送方式(all? account?device?tag?alias?):* appkey:* 消息ID(控制台可以查到):* deviceid(终端日志可以看到):
2019-12-01 23:32:23 0 浏览量 回答数 0

回答

详细解答可以参考官方帮助文档首次接入推送不成功 1、遇到问题可以先通过文档页进行关键字检索,一般都能命中相关的疑问。2、检查推送通道是否初始化成功,确保您在初始化时注册的回调函数onSuccess能够被成功调用。3、如果推送通道初始化失败:请查看错误日志以及错误码,按照错误提醒检查appkey,appSecret等相关配置。4、如果发送的是消息,客户端不会通知栏弹出展示,需要客户端实现消息回调,自定义消息的展示方式。5、使用官方demo体验,,排除自身配置问题。使用官方demo时需要设置您自己的appKey,appSecret并修改包名。如果使用官方demo无问题,请确认下自己的实现和demo的区别。6、如果您的设备集成上阿里云移动推送Android SDK,端上日志显示初始化成功,控制台显示设备在线,但是总是推送失败,请检查以下参数是否符合规范: 请检查您的APP的versionName参数,versionName参数不能为null,同时长度不能超过32位。如果versionName参数不符合要求,请更改versionName参数。 修改后务必先卸载原有App然后重新安装,不要直接覆盖安装。 7、如果集成成功,向设备推送通知,排查系统显示已到达,但设备端并未弹窗显示。请确认推送的是通知还是消息,只有通知才会在通知栏创建通知,消息不会创建通知,需要用户在SDK端的onMessage接口中自行处理。8、推送消息,设备端日志显示已经收到推送,但用户回调未被调用。推送消息在端上的路由过程涉及到发送应用内广播,部分设备存在广播拦截,请确认您的设备是否存在该问题: 1.正常情况下的日志: 第一条handleRemoteMessage日志说明消息已经到达端上,第二条AgooMessageReceiver日志表明用户自定义Receiver已经接收到广播。 2.如果只有第一条日志,未出现第二条日志则说明receiver没有正常接收到广播,需要测试设备是否会拦截广播。测试代码如下: Intent intent = new Intent();intent.setAction("org.agoo.android.intent.action.RECEIVE");intent.setPackage(pack);//pack为应用包名intent.putExtra("type", "common-push");intent.addFlags(32);context.sendBroadcast(intent);//请使用ApplicationContext进行测试利用上述代码给您的自定义receiver发送广播,测试Receiver是否可以收到对应广播,如果还是收不到则说明存在广播拦截情况。 3.如果存在拦截情况,请确认你的设备是否不允许监听系统广播:在manifest.xml文件中将自定义receiver所监听的系统广播注释掉,具体操作如下文代码所示: <!-- 消息接收监听器 (用户可自主扩展) --> <receiver android:name=".demo.MyMessageReceiver" android:exported="true"> <intent-filter> <action android:name="com.alibaba.push2.action.NOTIFICATION_OPENED" /> </intent-filter> <intent-filter> <action android:name="com.alibaba.push2.action.NOTIFICATION_REMOVED" /> </intent-filter> <intent-filter> <action android:name="com.taobao.accs.intent.action.COMMAND" /> </intent-filter> <intent-filter> <action android:name="com.taobao.taobao.intent.action.COMMAND" /> </intent-filter> <intent-filter> <action android:name="org.agoo.android.intent.action.RECEIVE" /> </intent-filter> <!--<intent-filter>--> <!--<action android:name="android.net.conn.CONNECTIVITY_CHANGE" />--> <!--</intent-filter>--> <!--<intent-filter>--> <!--<action android:name="android.intent.action.USER_PRESENT" />--> <!--</intent-filter>--> <!--<intent-filter>--> <!--<action android:name="android.intent.action.BOOT_COMPLETED" />--> <!--</intent-filter>--> <!--<intent-filter>--> <!--<action android:name="android.intent.action.PACKAGE_REMOVED" />--> <!--<data android:scheme="package" />--> <!--</intent-filter>--> </receiver>重复步骤2的操作,观察是否会可以成功接收广播。如果可以则说明您的设备rom不允许监听系统广播。当前receiver不监听系统广播不影响功能的正常使用,但会影响SDK的保活能力。 9、- 设备绑定标签后,服务端按该标签推送,隔天(T + 1)才能生效送达,参考Android API介绍 - 标签API。 已经接入成功,突然出现异常 1、推送通知,如果有设备能收到,有设备不能收到,请检查不能收到通知设备的手机设置情况,是否将推送App的通知弹出做了限制。2、如果出现应用处于前台可以收到推送,应用退到后台后无法接收到推送。请检查channel进程是否执行了推送初始化操作。 1.判断channel是否执行初始化方法:查看channel进程是否有如下日志输出,如无则表示未执行相应初始化操作 12-26 11:26:19.673 1951-1951/com.alibaba.push2:channel I/SecurityBoxService: Aliyun12-26 11:26:19.677 1951-1951/com.alibaba.push2:channel I/MPS:CloudPushService: [AMS]Initialize Mobile Push service...12-26 11:26:19.727 1951-1951/com.alibaba.push2:channel D/MPS:CloudPushService: load utdid: Vs6CkGxR86QDANku3NiLD/yA12-26 11:26:19.743 1951-1951/com.alibaba.push2:channel D/MPS:AppRegister: getLooper called.12-26 11:26:19.744 1951-1989/com.alibaba.push2:channel D/MPS:AppRegister: Looping Prepared.12-26 11:26:19.744 1951-1989/com.alibaba.push2:channel D/MPS:AppRegister: Looping handleMessage: 112-26 11:26:19.747 1951-1989/com.alibaba.push2:channel D/MPS:AppRegister: accs init.12-26 11:26:19.747 1951-1989/com.alibaba.push2:channel D/MPS:AppRegister: initAccsChannel...12-26 11:26:19.748 1951-1989/com.alibaba.push2:channel I/MPS:AppRegister: [AMS]appkey:235528812.常见错误: (1) 用户在自定义Application中执行推送SDK初始化时做了进程判断,导致初始化操作只在主进程执行。错误代码如下所示: public class MyApplication extends Application { @override public void onCreate() { super.onCreate(); if(如果是主进程) { initCloudChannel(this); } } ......} (2) 用户在activity中进行相关初始化,activity只会在主进程创建,导致相关操作只能在主进程执行。错误代码如下所示: public class MyActivity extends Activity { @override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); initCloudChannel(getApplicationContext()); ...... } ......} 3、部分ROM对应用自动拉起管控较严格,如果您的设备是小米或者华为,且当前应用被杀死,建议配置小米和华为辅助通道以及小米托管弹窗,可以提升到达率。相关文档:小米/华为系统推送支持4、利用推送排查系统排错。排错方法:获取设备deviceId,对deviceId单独推送一条,在排查系统查看相关信息。如下图:5、如果推送排查页面显示未知错误,请确认测试设备是否关闭了推送通道即是否调用过turnOffPushChannel接口。如果是,必须再次调用turnOnPushChannel接口重新打开推送通道。6、用测试appKey测试正常,切换成正式appKey(测试appKey和正式appKey对应相同的包名)之后收不到推送。SDK在初始化过程中有本地请求缓存,更换appKey后需清理本地缓存或卸载测试app重新安装正式app。7、从V2.+版本升级到V3.+版本后接收不到推送。V2.+和V3.+版本在配置上有所区别,详细排查逻辑请参考:移动推送Android SDK:推送从2.+版本升级到3.+版本后,收不到通知/消息 问题仍未解决若上述步骤仍未能定位问题,可以: 加入钉钉群,群号:11795523。或者提交工单,工单请选择类目移动推送。 反馈问题时,请附带下述格式化的问题上下文信息,方便快速定位问题(带*项必填): 您的操作行为:异常的现象:设备的平台(Android?iOS?),机型,系统版本号:推送类型(消息?通知?):推送方式(all? account?device?tag?alias?):* appkey:* 消息ID(控制台可以查到):* deviceid(终端日志可以看到):
2019-12-01 23:32:23 0 浏览量 回答数 0

回答

详细解答可以参考官方帮助文档首次接入推送不成功 1、遇到问题可以先通过文档页进行关键字检索,一般都能命中相关的疑问。2、检查推送通道是否初始化成功,确保您在初始化时注册的回调函数onSuccess能够被成功调用。3、如果推送通道初始化失败:请查看错误日志以及错误码,按照错误提醒检查appkey,appSecret等相关配置。4、如果发送的是消息,客户端不会通知栏弹出展示,需要客户端实现消息回调,自定义消息的展示方式。5、使用官方demo体验,,排除自身配置问题。使用官方demo时需要设置您自己的appKey,appSecret并修改包名。如果使用官方demo无问题,请确认下自己的实现和demo的区别。6、如果您的设备集成上阿里云移动推送Android SDK,端上日志显示初始化成功,控制台显示设备在线,但是总是推送失败,请检查以下参数是否符合规范: 请检查您的APP的versionName参数,versionName参数不能为null,同时长度不能超过32位。如果versionName参数不符合要求,请更改versionName参数。 修改后务必先卸载原有App然后重新安装,不要直接覆盖安装。 7、如果集成成功,向设备推送通知,排查系统显示已到达,但设备端并未弹窗显示。请确认推送的是通知还是消息,只有通知才会在通知栏创建通知,消息不会创建通知,需要用户在SDK端的onMessage接口中自行处理。8、推送消息,设备端日志显示已经收到推送,但用户回调未被调用。推送消息在端上的路由过程涉及到发送应用内广播,部分设备存在广播拦截,请确认您的设备是否存在该问题: 1.正常情况下的日志: 第一条handleRemoteMessage日志说明消息已经到达端上,第二条AgooMessageReceiver日志表明用户自定义Receiver已经接收到广播。 2.如果只有第一条日志,未出现第二条日志则说明receiver没有正常接收到广播,需要测试设备是否会拦截广播。测试代码如下: Intent intent = new Intent();intent.setAction("org.agoo.android.intent.action.RECEIVE");intent.setPackage(pack);//pack为应用包名intent.putExtra("type", "common-push");intent.addFlags(32);context.sendBroadcast(intent);//请使用ApplicationContext进行测试利用上述代码给您的自定义receiver发送广播,测试Receiver是否可以收到对应广播,如果还是收不到则说明存在广播拦截情况。 3.如果存在拦截情况,请确认你的设备是否不允许监听系统广播:在manifest.xml文件中将自定义receiver所监听的系统广播注释掉,具体操作如下文代码所示: <!-- 消息接收监听器 (用户可自主扩展) --> <receiver android:name=".demo.MyMessageReceiver" android:exported="true"> <intent-filter> <action android:name="com.alibaba.push2.action.NOTIFICATION_OPENED" /> </intent-filter> <intent-filter> <action android:name="com.alibaba.push2.action.NOTIFICATION_REMOVED" /> </intent-filter> <intent-filter> <action android:name="com.taobao.accs.intent.action.COMMAND" /> </intent-filter> <intent-filter> <action android:name="com.taobao.taobao.intent.action.COMMAND" /> </intent-filter> <intent-filter> <action android:name="org.agoo.android.intent.action.RECEIVE" /> </intent-filter> <!--<intent-filter>--> <!--<action android:name="android.net.conn.CONNECTIVITY_CHANGE" />--> <!--</intent-filter>--> <!--<intent-filter>--> <!--<action android:name="android.intent.action.USER_PRESENT" />--> <!--</intent-filter>--> <!--<intent-filter>--> <!--<action android:name="android.intent.action.BOOT_COMPLETED" />--> <!--</intent-filter>--> <!--<intent-filter>--> <!--<action android:name="android.intent.action.PACKAGE_REMOVED" />--> <!--<data android:scheme="package" />--> <!--</intent-filter>--> </receiver>重复步骤2的操作,观察是否会可以成功接收广播。如果可以则说明您的设备rom不允许监听系统广播。当前receiver不监听系统广播不影响功能的正常使用,但会影响SDK的保活能力。 9、- 设备绑定标签后,服务端按该标签推送,隔天(T + 1)才能生效送达,参考Android API介绍 - 标签API。 已经接入成功,突然出现异常 1、推送通知,如果有设备能收到,有设备不能收到,请检查不能收到通知设备的手机设置情况,是否将推送App的通知弹出做了限制。2、如果出现应用处于前台可以收到推送,应用退到后台后无法接收到推送。请检查channel进程是否执行了推送初始化操作。 1.判断channel是否执行初始化方法:查看channel进程是否有如下日志输出,如无则表示未执行相应初始化操作 12-26 11:26:19.673 1951-1951/com.alibaba.push2:channel I/SecurityBoxService: Aliyun12-26 11:26:19.677 1951-1951/com.alibaba.push2:channel I/MPS:CloudPushService: [AMS]Initialize Mobile Push service...12-26 11:26:19.727 1951-1951/com.alibaba.push2:channel D/MPS:CloudPushService: load utdid: Vs6CkGxR86QDANku3NiLD/yA12-26 11:26:19.743 1951-1951/com.alibaba.push2:channel D/MPS:AppRegister: getLooper called.12-26 11:26:19.744 1951-1989/com.alibaba.push2:channel D/MPS:AppRegister: Looping Prepared.12-26 11:26:19.744 1951-1989/com.alibaba.push2:channel D/MPS:AppRegister: Looping handleMessage: 112-26 11:26:19.747 1951-1989/com.alibaba.push2:channel D/MPS:AppRegister: accs init.12-26 11:26:19.747 1951-1989/com.alibaba.push2:channel D/MPS:AppRegister: initAccsChannel...12-26 11:26:19.748 1951-1989/com.alibaba.push2:channel I/MPS:AppRegister: [AMS]appkey:235528812.常见错误: (1) 用户在自定义Application中执行推送SDK初始化时做了进程判断,导致初始化操作只在主进程执行。错误代码如下所示: public class MyApplication extends Application { @override public void onCreate() { super.onCreate(); if(如果是主进程) { initCloudChannel(this); } } ......} (2) 用户在activity中进行相关初始化,activity只会在主进程创建,导致相关操作只能在主进程执行。错误代码如下所示: public class MyActivity extends Activity { @override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); initCloudChannel(getApplicationContext()); ...... } ......} 3、部分ROM对应用自动拉起管控较严格,如果您的设备是小米或者华为,且当前应用被杀死,建议配置小米和华为辅助通道以及小米托管弹窗,可以提升到达率。相关文档:小米/华为系统推送支持4、利用推送排查系统排错。排错方法:获取设备deviceId,对deviceId单独推送一条,在排查系统查看相关信息。如下图:5、如果推送排查页面显示未知错误,请确认测试设备是否关闭了推送通道即是否调用过turnOffPushChannel接口。如果是,必须再次调用turnOnPushChannel接口重新打开推送通道。6、用测试appKey测试正常,切换成正式appKey(测试appKey和正式appKey对应相同的包名)之后收不到推送。SDK在初始化过程中有本地请求缓存,更换appKey后需清理本地缓存或卸载测试app重新安装正式app。7、从V2.+版本升级到V3.+版本后接收不到推送。V2.+和V3.+版本在配置上有所区别,详细排查逻辑请参考:移动推送Android SDK:推送从2.+版本升级到3.+版本后,收不到通知/消息 问题仍未解决若上述步骤仍未能定位问题,可以: 加入钉钉群,群号:11795523。或者提交工单,工单请选择类目移动推送。 反馈问题时,请附带下述格式化的问题上下文信息,方便快速定位问题(带*项必填): 您的操作行为:异常的现象:设备的平台(Android?iOS?),机型,系统版本号:推送类型(消息?通知?):推送方式(all? account?device?tag?alias?):* appkey:* 消息ID(控制台可以查到):* deviceid(终端日志可以看到):
2019-12-01 23:32:22 0 浏览量 回答数 0

回答

详细解答可以参考官方帮助文档首次接入推送不成功 1、遇到问题可以先通过文档页进行关键字检索,一般都能命中相关的疑问。2、检查推送通道是否初始化成功,确保您在初始化时注册的回调函数onSuccess能够被成功调用。3、如果推送通道初始化失败:请查看错误日志以及错误码,按照错误提醒检查appkey,appSecret等相关配置。4、如果发送的是消息,客户端不会通知栏弹出展示,需要客户端实现消息回调,自定义消息的展示方式。5、使用官方demo体验,,排除自身配置问题。使用官方demo时需要设置您自己的appKey,appSecret并修改包名。如果使用官方demo无问题,请确认下自己的实现和demo的区别。6、如果您的设备集成上阿里云移动推送Android SDK,端上日志显示初始化成功,控制台显示设备在线,但是总是推送失败,请检查以下参数是否符合规范: 请检查您的APP的versionName参数,versionName参数不能为null,同时长度不能超过32位。如果versionName参数不符合要求,请更改versionName参数。 修改后务必先卸载原有App然后重新安装,不要直接覆盖安装。 7、如果集成成功,向设备推送通知,排查系统显示已到达,但设备端并未弹窗显示。请确认推送的是通知还是消息,只有通知才会在通知栏创建通知,消息不会创建通知,需要用户在SDK端的onMessage接口中自行处理。8、推送消息,设备端日志显示已经收到推送,但用户回调未被调用。推送消息在端上的路由过程涉及到发送应用内广播,部分设备存在广播拦截,请确认您的设备是否存在该问题: 1.正常情况下的日志: 第一条handleRemoteMessage日志说明消息已经到达端上,第二条AgooMessageReceiver日志表明用户自定义Receiver已经接收到广播。 2.如果只有第一条日志,未出现第二条日志则说明receiver没有正常接收到广播,需要测试设备是否会拦截广播。测试代码如下: Intent intent = new Intent();intent.setAction("org.agoo.android.intent.action.RECEIVE");intent.setPackage(pack);//pack为应用包名intent.putExtra("type", "common-push");intent.addFlags(32);context.sendBroadcast(intent);//请使用ApplicationContext进行测试利用上述代码给您的自定义receiver发送广播,测试Receiver是否可以收到对应广播,如果还是收不到则说明存在广播拦截情况。 3.如果存在拦截情况,请确认你的设备是否不允许监听系统广播:在manifest.xml文件中将自定义receiver所监听的系统广播注释掉,具体操作如下文代码所示: <!-- 消息接收监听器 (用户可自主扩展) --> <receiver android:name=".demo.MyMessageReceiver" android:exported="true"> <intent-filter> <action android:name="com.alibaba.push2.action.NOTIFICATION_OPENED" /> </intent-filter> <intent-filter> <action android:name="com.alibaba.push2.action.NOTIFICATION_REMOVED" /> </intent-filter> <intent-filter> <action android:name="com.taobao.accs.intent.action.COMMAND" /> </intent-filter> <intent-filter> <action android:name="com.taobao.taobao.intent.action.COMMAND" /> </intent-filter> <intent-filter> <action android:name="org.agoo.android.intent.action.RECEIVE" /> </intent-filter> <!--<intent-filter>--> <!--<action android:name="android.net.conn.CONNECTIVITY_CHANGE" />--> <!--</intent-filter>--> <!--<intent-filter>--> <!--<action android:name="android.intent.action.USER_PRESENT" />--> <!--</intent-filter>--> <!--<intent-filter>--> <!--<action android:name="android.intent.action.BOOT_COMPLETED" />--> <!--</intent-filter>--> <!--<intent-filter>--> <!--<action android:name="android.intent.action.PACKAGE_REMOVED" />--> <!--<data android:scheme="package" />--> <!--</intent-filter>--> </receiver>重复步骤2的操作,观察是否会可以成功接收广播。如果可以则说明您的设备rom不允许监听系统广播。当前receiver不监听系统广播不影响功能的正常使用,但会影响SDK的保活能力。 9、- 设备绑定标签后,服务端按该标签推送,隔天(T + 1)才能生效送达,参考Android API介绍 - 标签API。 已经接入成功,突然出现异常 1、推送通知,如果有设备能收到,有设备不能收到,请检查不能收到通知设备的手机设置情况,是否将推送App的通知弹出做了限制。2、如果出现应用处于前台可以收到推送,应用退到后台后无法接收到推送。请检查channel进程是否执行了推送初始化操作。 1.判断channel是否执行初始化方法:查看channel进程是否有如下日志输出,如无则表示未执行相应初始化操作 12-26 11:26:19.673 1951-1951/com.alibaba.push2:channel I/SecurityBoxService: Aliyun12-26 11:26:19.677 1951-1951/com.alibaba.push2:channel I/MPS:CloudPushService: [AMS]Initialize Mobile Push service...12-26 11:26:19.727 1951-1951/com.alibaba.push2:channel D/MPS:CloudPushService: load utdid: Vs6CkGxR86QDANku3NiLD/yA12-26 11:26:19.743 1951-1951/com.alibaba.push2:channel D/MPS:AppRegister: getLooper called.12-26 11:26:19.744 1951-1989/com.alibaba.push2:channel D/MPS:AppRegister: Looping Prepared.12-26 11:26:19.744 1951-1989/com.alibaba.push2:channel D/MPS:AppRegister: Looping handleMessage: 112-26 11:26:19.747 1951-1989/com.alibaba.push2:channel D/MPS:AppRegister: accs init.12-26 11:26:19.747 1951-1989/com.alibaba.push2:channel D/MPS:AppRegister: initAccsChannel...12-26 11:26:19.748 1951-1989/com.alibaba.push2:channel I/MPS:AppRegister: [AMS]appkey:235528812.常见错误: (1) 用户在自定义Application中执行推送SDK初始化时做了进程判断,导致初始化操作只在主进程执行。错误代码如下所示: public class MyApplication extends Application { @override public void onCreate() { super.onCreate(); if(如果是主进程) { initCloudChannel(this); } } ......} (2) 用户在activity中进行相关初始化,activity只会在主进程创建,导致相关操作只能在主进程执行。错误代码如下所示: public class MyActivity extends Activity { @override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); initCloudChannel(getApplicationContext()); ...... } ......} 3、部分ROM对应用自动拉起管控较严格,如果您的设备是小米或者华为,且当前应用被杀死,建议配置小米和华为辅助通道以及小米托管弹窗,可以提升到达率。相关文档:小米/华为系统推送支持4、利用推送排查系统排错。排错方法:获取设备deviceId,对deviceId单独推送一条,在排查系统查看相关信息。如下图:5、如果推送排查页面显示未知错误,请确认测试设备是否关闭了推送通道即是否调用过turnOffPushChannel接口。如果是,必须再次调用turnOnPushChannel接口重新打开推送通道。6、用测试appKey测试正常,切换成正式appKey(测试appKey和正式appKey对应相同的包名)之后收不到推送。SDK在初始化过程中有本地请求缓存,更换appKey后需清理本地缓存或卸载测试app重新安装正式app。7、从V2.+版本升级到V3.+版本后接收不到推送。V2.+和V3.+版本在配置上有所区别,详细排查逻辑请参考:移动推送Android SDK:推送从2.+版本升级到3.+版本后,收不到通知/消息 问题仍未解决若上述步骤仍未能定位问题,可以: 加入钉钉群,群号:11795523。或者提交工单,工单请选择类目移动推送。 反馈问题时,请附带下述格式化的问题上下文信息,方便快速定位问题(带*项必填): 您的操作行为:异常的现象:设备的平台(Android?iOS?),机型,系统版本号:推送类型(消息?通知?):推送方式(all? account?device?tag?alias?):* appkey:* 消息ID(控制台可以查到):* deviceid(终端日志可以看到):
2019-12-01 23:32:23 0 浏览量 回答数 0

回答

详细解答可以参考官方帮助文档首次接入推送不成功 1、遇到问题可以先通过文档页进行关键字检索,一般都能命中相关的疑问。2、检查推送通道是否初始化成功,确保您在初始化时注册的回调函数onSuccess能够被成功调用。3、如果推送通道初始化失败:请查看错误日志以及错误码,按照错误提醒检查appkey,appSecret等相关配置。4、如果发送的是消息,客户端不会通知栏弹出展示,需要客户端实现消息回调,自定义消息的展示方式。5、使用官方demo体验,,排除自身配置问题。使用官方demo时需要设置您自己的appKey,appSecret并修改包名。如果使用官方demo无问题,请确认下自己的实现和demo的区别。6、如果您的设备集成上阿里云移动推送Android SDK,端上日志显示初始化成功,控制台显示设备在线,但是总是推送失败,请检查以下参数是否符合规范: 请检查您的APP的versionName参数,versionName参数不能为null,同时长度不能超过32位。如果versionName参数不符合要求,请更改versionName参数。 修改后务必先卸载原有App然后重新安装,不要直接覆盖安装。 7、如果集成成功,向设备推送通知,排查系统显示已到达,但设备端并未弹窗显示。请确认推送的是通知还是消息,只有通知才会在通知栏创建通知,消息不会创建通知,需要用户在SDK端的onMessage接口中自行处理。8、推送消息,设备端日志显示已经收到推送,但用户回调未被调用。推送消息在端上的路由过程涉及到发送应用内广播,部分设备存在广播拦截,请确认您的设备是否存在该问题: 1.正常情况下的日志: 第一条handleRemoteMessage日志说明消息已经到达端上,第二条AgooMessageReceiver日志表明用户自定义Receiver已经接收到广播。 2.如果只有第一条日志,未出现第二条日志则说明receiver没有正常接收到广播,需要测试设备是否会拦截广播。测试代码如下: Intent intent = new Intent();intent.setAction("org.agoo.android.intent.action.RECEIVE");intent.setPackage(pack);//pack为应用包名intent.putExtra("type", "common-push");intent.addFlags(32);context.sendBroadcast(intent);//请使用ApplicationContext进行测试利用上述代码给您的自定义receiver发送广播,测试Receiver是否可以收到对应广播,如果还是收不到则说明存在广播拦截情况。 3.如果存在拦截情况,请确认你的设备是否不允许监听系统广播:在manifest.xml文件中将自定义receiver所监听的系统广播注释掉,具体操作如下文代码所示: <!-- 消息接收监听器 (用户可自主扩展) --> <receiver android:name=".demo.MyMessageReceiver" android:exported="true"> <intent-filter> <action android:name="com.alibaba.push2.action.NOTIFICATION_OPENED" /> </intent-filter> <intent-filter> <action android:name="com.alibaba.push2.action.NOTIFICATION_REMOVED" /> </intent-filter> <intent-filter> <action android:name="com.taobao.accs.intent.action.COMMAND" /> </intent-filter> <intent-filter> <action android:name="com.taobao.taobao.intent.action.COMMAND" /> </intent-filter> <intent-filter> <action android:name="org.agoo.android.intent.action.RECEIVE" /> </intent-filter> <!--<intent-filter>--> <!--<action android:name="android.net.conn.CONNECTIVITY_CHANGE" />--> <!--</intent-filter>--> <!--<intent-filter>--> <!--<action android:name="android.intent.action.USER_PRESENT" />--> <!--</intent-filter>--> <!--<intent-filter>--> <!--<action android:name="android.intent.action.BOOT_COMPLETED" />--> <!--</intent-filter>--> <!--<intent-filter>--> <!--<action android:name="android.intent.action.PACKAGE_REMOVED" />--> <!--<data android:scheme="package" />--> <!--</intent-filter>--> </receiver>重复步骤2的操作,观察是否会可以成功接收广播。如果可以则说明您的设备rom不允许监听系统广播。当前receiver不监听系统广播不影响功能的正常使用,但会影响SDK的保活能力。 9、- 设备绑定标签后,服务端按该标签推送,隔天(T + 1)才能生效送达,参考Android API介绍 - 标签API。 已经接入成功,突然出现异常 1、推送通知,如果有设备能收到,有设备不能收到,请检查不能收到通知设备的手机设置情况,是否将推送App的通知弹出做了限制。2、如果出现应用处于前台可以收到推送,应用退到后台后无法接收到推送。请检查channel进程是否执行了推送初始化操作。 1.判断channel是否执行初始化方法:查看channel进程是否有如下日志输出,如无则表示未执行相应初始化操作 12-26 11:26:19.673 1951-1951/com.alibaba.push2:channel I/SecurityBoxService: Aliyun12-26 11:26:19.677 1951-1951/com.alibaba.push2:channel I/MPS:CloudPushService: [AMS]Initialize Mobile Push service...12-26 11:26:19.727 1951-1951/com.alibaba.push2:channel D/MPS:CloudPushService: load utdid: Vs6CkGxR86QDANku3NiLD/yA12-26 11:26:19.743 1951-1951/com.alibaba.push2:channel D/MPS:AppRegister: getLooper called.12-26 11:26:19.744 1951-1989/com.alibaba.push2:channel D/MPS:AppRegister: Looping Prepared.12-26 11:26:19.744 1951-1989/com.alibaba.push2:channel D/MPS:AppRegister: Looping handleMessage: 112-26 11:26:19.747 1951-1989/com.alibaba.push2:channel D/MPS:AppRegister: accs init.12-26 11:26:19.747 1951-1989/com.alibaba.push2:channel D/MPS:AppRegister: initAccsChannel...12-26 11:26:19.748 1951-1989/com.alibaba.push2:channel I/MPS:AppRegister: [AMS]appkey:235528812.常见错误: (1) 用户在自定义Application中执行推送SDK初始化时做了进程判断,导致初始化操作只在主进程执行。错误代码如下所示: public class MyApplication extends Application { @override public void onCreate() { super.onCreate(); if(如果是主进程) { initCloudChannel(this); } } ......} (2) 用户在activity中进行相关初始化,activity只会在主进程创建,导致相关操作只能在主进程执行。错误代码如下所示: public class MyActivity extends Activity { @override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); initCloudChannel(getApplicationContext()); ...... } ......} 3、部分ROM对应用自动拉起管控较严格,如果您的设备是小米或者华为,且当前应用被杀死,建议配置小米和华为辅助通道以及小米托管弹窗,可以提升到达率。相关文档:小米/华为系统推送支持4、利用推送排查系统排错。排错方法:获取设备deviceId,对deviceId单独推送一条,在排查系统查看相关信息。如下图:5、如果推送排查页面显示未知错误,请确认测试设备是否关闭了推送通道即是否调用过turnOffPushChannel接口。如果是,必须再次调用turnOnPushChannel接口重新打开推送通道。6、用测试appKey测试正常,切换成正式appKey(测试appKey和正式appKey对应相同的包名)之后收不到推送。SDK在初始化过程中有本地请求缓存,更换appKey后需清理本地缓存或卸载测试app重新安装正式app。7、从V2.+版本升级到V3.+版本后接收不到推送。V2.+和V3.+版本在配置上有所区别,详细排查逻辑请参考:移动推送Android SDK:推送从2.+版本升级到3.+版本后,收不到通知/消息 问题仍未解决若上述步骤仍未能定位问题,可以: 加入钉钉群,群号:11795523。或者提交工单,工单请选择类目移动推送。 反馈问题时,请附带下述格式化的问题上下文信息,方便快速定位问题(带*项必填): 您的操作行为:异常的现象:设备的平台(Android?iOS?),机型,系统版本号:推送类型(消息?通知?):推送方式(all? account?device?tag?alias?):* appkey:* 消息ID(控制台可以查到):* deviceid(终端日志可以看到):
2019-12-01 23:32:22 0 浏览量 回答数 0

回答

详细解答可以参考官方帮助文档首次接入推送不成功 1、遇到问题可以先通过文档页进行关键字检索,一般都能命中相关的疑问。2、检查推送通道是否初始化成功,确保您在初始化时注册的回调函数onSuccess能够被成功调用。3、如果推送通道初始化失败:请查看错误日志以及错误码,按照错误提醒检查appkey,appSecret等相关配置。4、如果发送的是消息,客户端不会通知栏弹出展示,需要客户端实现消息回调,自定义消息的展示方式。5、使用官方demo体验,,排除自身配置问题。使用官方demo时需要设置您自己的appKey,appSecret并修改包名。如果使用官方demo无问题,请确认下自己的实现和demo的区别。6、如果您的设备集成上阿里云移动推送Android SDK,端上日志显示初始化成功,控制台显示设备在线,但是总是推送失败,请检查以下参数是否符合规范: 请检查您的APP的versionName参数,versionName参数不能为null,同时长度不能超过32位。如果versionName参数不符合要求,请更改versionName参数。 修改后务必先卸载原有App然后重新安装,不要直接覆盖安装。 7、如果集成成功,向设备推送通知,排查系统显示已到达,但设备端并未弹窗显示。请确认推送的是通知还是消息,只有通知才会在通知栏创建通知,消息不会创建通知,需要用户在SDK端的onMessage接口中自行处理。8、推送消息,设备端日志显示已经收到推送,但用户回调未被调用。推送消息在端上的路由过程涉及到发送应用内广播,部分设备存在广播拦截,请确认您的设备是否存在该问题: 1.正常情况下的日志: 第一条handleRemoteMessage日志说明消息已经到达端上,第二条AgooMessageReceiver日志表明用户自定义Receiver已经接收到广播。 2.如果只有第一条日志,未出现第二条日志则说明receiver没有正常接收到广播,需要测试设备是否会拦截广播。测试代码如下: Intent intent = new Intent();intent.setAction("org.agoo.android.intent.action.RECEIVE");intent.setPackage(pack);//pack为应用包名intent.putExtra("type", "common-push");intent.addFlags(32);context.sendBroadcast(intent);//请使用ApplicationContext进行测试利用上述代码给您的自定义receiver发送广播,测试Receiver是否可以收到对应广播,如果还是收不到则说明存在广播拦截情况。 3.如果存在拦截情况,请确认你的设备是否不允许监听系统广播:在manifest.xml文件中将自定义receiver所监听的系统广播注释掉,具体操作如下文代码所示: <!-- 消息接收监听器 (用户可自主扩展) --> <receiver android:name=".demo.MyMessageReceiver" android:exported="true"> <intent-filter> <action android:name="com.alibaba.push2.action.NOTIFICATION_OPENED" /> </intent-filter> <intent-filter> <action android:name="com.alibaba.push2.action.NOTIFICATION_REMOVED" /> </intent-filter> <intent-filter> <action android:name="com.taobao.accs.intent.action.COMMAND" /> </intent-filter> <intent-filter> <action android:name="com.taobao.taobao.intent.action.COMMAND" /> </intent-filter> <intent-filter> <action android:name="org.agoo.android.intent.action.RECEIVE" /> </intent-filter> <!--<intent-filter>--> <!--<action android:name="android.net.conn.CONNECTIVITY_CHANGE" />--> <!--</intent-filter>--> <!--<intent-filter>--> <!--<action android:name="android.intent.action.USER_PRESENT" />--> <!--</intent-filter>--> <!--<intent-filter>--> <!--<action android:name="android.intent.action.BOOT_COMPLETED" />--> <!--</intent-filter>--> <!--<intent-filter>--> <!--<action android:name="android.intent.action.PACKAGE_REMOVED" />--> <!--<data android:scheme="package" />--> <!--</intent-filter>--> </receiver>重复步骤2的操作,观察是否会可以成功接收广播。如果可以则说明您的设备rom不允许监听系统广播。当前receiver不监听系统广播不影响功能的正常使用,但会影响SDK的保活能力。 9、- 设备绑定标签后,服务端按该标签推送,隔天(T + 1)才能生效送达,参考Android API介绍 - 标签API。 已经接入成功,突然出现异常 1、推送通知,如果有设备能收到,有设备不能收到,请检查不能收到通知设备的手机设置情况,是否将推送App的通知弹出做了限制。2、如果出现应用处于前台可以收到推送,应用退到后台后无法接收到推送。请检查channel进程是否执行了推送初始化操作。 1.判断channel是否执行初始化方法:查看channel进程是否有如下日志输出,如无则表示未执行相应初始化操作 12-26 11:26:19.673 1951-1951/com.alibaba.push2:channel I/SecurityBoxService: Aliyun12-26 11:26:19.677 1951-1951/com.alibaba.push2:channel I/MPS:CloudPushService: [AMS]Initialize Mobile Push service...12-26 11:26:19.727 1951-1951/com.alibaba.push2:channel D/MPS:CloudPushService: load utdid: Vs6CkGxR86QDANku3NiLD/yA12-26 11:26:19.743 1951-1951/com.alibaba.push2:channel D/MPS:AppRegister: getLooper called.12-26 11:26:19.744 1951-1989/com.alibaba.push2:channel D/MPS:AppRegister: Looping Prepared.12-26 11:26:19.744 1951-1989/com.alibaba.push2:channel D/MPS:AppRegister: Looping handleMessage: 112-26 11:26:19.747 1951-1989/com.alibaba.push2:channel D/MPS:AppRegister: accs init.12-26 11:26:19.747 1951-1989/com.alibaba.push2:channel D/MPS:AppRegister: initAccsChannel...12-26 11:26:19.748 1951-1989/com.alibaba.push2:channel I/MPS:AppRegister: [AMS]appkey:235528812.常见错误: (1) 用户在自定义Application中执行推送SDK初始化时做了进程判断,导致初始化操作只在主进程执行。错误代码如下所示: public class MyApplication extends Application { @override public void onCreate() { super.onCreate(); if(如果是主进程) { initCloudChannel(this); } } ......} (2) 用户在activity中进行相关初始化,activity只会在主进程创建,导致相关操作只能在主进程执行。错误代码如下所示: public class MyActivity extends Activity { @override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); initCloudChannel(getApplicationContext()); ...... } ......} 3、部分ROM对应用自动拉起管控较严格,如果您的设备是小米或者华为,且当前应用被杀死,建议配置小米和华为辅助通道以及小米托管弹窗,可以提升到达率。相关文档:小米/华为系统推送支持4、利用推送排查系统排错。排错方法:获取设备deviceId,对deviceId单独推送一条,在排查系统查看相关信息。如下图:5、如果推送排查页面显示未知错误,请确认测试设备是否关闭了推送通道即是否调用过turnOffPushChannel接口。如果是,必须再次调用turnOnPushChannel接口重新打开推送通道。6、用测试appKey测试正常,切换成正式appKey(测试appKey和正式appKey对应相同的包名)之后收不到推送。SDK在初始化过程中有本地请求缓存,更换appKey后需清理本地缓存或卸载测试app重新安装正式app。7、从V2.+版本升级到V3.+版本后接收不到推送。V2.+和V3.+版本在配置上有所区别,详细排查逻辑请参考:移动推送Android SDK:推送从2.+版本升级到3.+版本后,收不到通知/消息 问题仍未解决若上述步骤仍未能定位问题,可以: 加入钉钉群,群号:11795523。或者提交工单,工单请选择类目移动推送。 反馈问题时,请附带下述格式化的问题上下文信息,方便快速定位问题(带*项必填): 您的操作行为:异常的现象:设备的平台(Android?iOS?),机型,系统版本号:推送类型(消息?通知?):推送方式(all? account?device?tag?alias?):* appkey:* 消息ID(控制台可以查到):* deviceid(终端日志可以看到):
2019-12-01 23:32:22 0 浏览量 回答数 0

回答

详细解答可以参考官方帮助文档首次接入推送不成功 1、遇到问题可以先通过文档页进行关键字检索,一般都能命中相关的疑问。2、检查推送通道是否初始化成功,确保您在初始化时注册的回调函数onSuccess能够被成功调用。3、如果推送通道初始化失败:请查看错误日志以及错误码,按照错误提醒检查appkey,appSecret等相关配置。4、如果发送的是消息,客户端不会通知栏弹出展示,需要客户端实现消息回调,自定义消息的展示方式。5、使用官方demo体验,,排除自身配置问题。使用官方demo时需要设置您自己的appKey,appSecret并修改包名。如果使用官方demo无问题,请确认下自己的实现和demo的区别。6、如果您的设备集成上阿里云移动推送Android SDK,端上日志显示初始化成功,控制台显示设备在线,但是总是推送失败,请检查以下参数是否符合规范: 请检查您的APP的versionName参数,versionName参数不能为null,同时长度不能超过32位。如果versionName参数不符合要求,请更改versionName参数。 修改后务必先卸载原有App然后重新安装,不要直接覆盖安装。 7、如果集成成功,向设备推送通知,排查系统显示已到达,但设备端并未弹窗显示。请确认推送的是通知还是消息,只有通知才会在通知栏创建通知,消息不会创建通知,需要用户在SDK端的onMessage接口中自行处理。8、推送消息,设备端日志显示已经收到推送,但用户回调未被调用。推送消息在端上的路由过程涉及到发送应用内广播,部分设备存在广播拦截,请确认您的设备是否存在该问题: 1.正常情况下的日志: 第一条handleRemoteMessage日志说明消息已经到达端上,第二条AgooMessageReceiver日志表明用户自定义Receiver已经接收到广播。 2.如果只有第一条日志,未出现第二条日志则说明receiver没有正常接收到广播,需要测试设备是否会拦截广播。测试代码如下: Intent intent = new Intent();intent.setAction("org.agoo.android.intent.action.RECEIVE");intent.setPackage(pack);//pack为应用包名intent.putExtra("type", "common-push");intent.addFlags(32);context.sendBroadcast(intent);//请使用ApplicationContext进行测试利用上述代码给您的自定义receiver发送广播,测试Receiver是否可以收到对应广播,如果还是收不到则说明存在广播拦截情况。 3.如果存在拦截情况,请确认你的设备是否不允许监听系统广播:在manifest.xml文件中将自定义receiver所监听的系统广播注释掉,具体操作如下文代码所示: <!-- 消息接收监听器 (用户可自主扩展) --> <receiver android:name=".demo.MyMessageReceiver" android:exported="true"> <intent-filter> <action android:name="com.alibaba.push2.action.NOTIFICATION_OPENED" /> </intent-filter> <intent-filter> <action android:name="com.alibaba.push2.action.NOTIFICATION_REMOVED" /> </intent-filter> <intent-filter> <action android:name="com.taobao.accs.intent.action.COMMAND" /> </intent-filter> <intent-filter> <action android:name="com.taobao.taobao.intent.action.COMMAND" /> </intent-filter> <intent-filter> <action android:name="org.agoo.android.intent.action.RECEIVE" /> </intent-filter> <!--<intent-filter>--> <!--<action android:name="android.net.conn.CONNECTIVITY_CHANGE" />--> <!--</intent-filter>--> <!--<intent-filter>--> <!--<action android:name="android.intent.action.USER_PRESENT" />--> <!--</intent-filter>--> <!--<intent-filter>--> <!--<action android:name="android.intent.action.BOOT_COMPLETED" />--> <!--</intent-filter>--> <!--<intent-filter>--> <!--<action android:name="android.intent.action.PACKAGE_REMOVED" />--> <!--<data android:scheme="package" />--> <!--</intent-filter>--> </receiver>重复步骤2的操作,观察是否会可以成功接收广播。如果可以则说明您的设备rom不允许监听系统广播。当前receiver不监听系统广播不影响功能的正常使用,但会影响SDK的保活能力。 9、- 设备绑定标签后,服务端按该标签推送,隔天(T + 1)才能生效送达,参考Android API介绍 - 标签API。 已经接入成功,突然出现异常 1、推送通知,如果有设备能收到,有设备不能收到,请检查不能收到通知设备的手机设置情况,是否将推送App的通知弹出做了限制。2、如果出现应用处于前台可以收到推送,应用退到后台后无法接收到推送。请检查channel进程是否执行了推送初始化操作。 1.判断channel是否执行初始化方法:查看channel进程是否有如下日志输出,如无则表示未执行相应初始化操作 12-26 11:26:19.673 1951-1951/com.alibaba.push2:channel I/SecurityBoxService: Aliyun12-26 11:26:19.677 1951-1951/com.alibaba.push2:channel I/MPS:CloudPushService: [AMS]Initialize Mobile Push service...12-26 11:26:19.727 1951-1951/com.alibaba.push2:channel D/MPS:CloudPushService: load utdid: Vs6CkGxR86QDANku3NiLD/yA12-26 11:26:19.743 1951-1951/com.alibaba.push2:channel D/MPS:AppRegister: getLooper called.12-26 11:26:19.744 1951-1989/com.alibaba.push2:channel D/MPS:AppRegister: Looping Prepared.12-26 11:26:19.744 1951-1989/com.alibaba.push2:channel D/MPS:AppRegister: Looping handleMessage: 112-26 11:26:19.747 1951-1989/com.alibaba.push2:channel D/MPS:AppRegister: accs init.12-26 11:26:19.747 1951-1989/com.alibaba.push2:channel D/MPS:AppRegister: initAccsChannel...12-26 11:26:19.748 1951-1989/com.alibaba.push2:channel I/MPS:AppRegister: [AMS]appkey:235528812.常见错误: (1) 用户在自定义Application中执行推送SDK初始化时做了进程判断,导致初始化操作只在主进程执行。错误代码如下所示: public class MyApplication extends Application { @override public void onCreate() { super.onCreate(); if(如果是主进程) { initCloudChannel(this); } } ......} (2) 用户在activity中进行相关初始化,activity只会在主进程创建,导致相关操作只能在主进程执行。错误代码如下所示: public class MyActivity extends Activity { @override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); initCloudChannel(getApplicationContext()); ...... } ......} 3、部分ROM对应用自动拉起管控较严格,如果您的设备是小米或者华为,且当前应用被杀死,建议配置小米和华为辅助通道以及小米托管弹窗,可以提升到达率。相关文档:小米/华为系统推送支持4、利用推送排查系统排错。排错方法:获取设备deviceId,对deviceId单独推送一条,在排查系统查看相关信息。如下图:5、如果推送排查页面显示未知错误,请确认测试设备是否关闭了推送通道即是否调用过turnOffPushChannel接口。如果是,必须再次调用turnOnPushChannel接口重新打开推送通道。6、用测试appKey测试正常,切换成正式appKey(测试appKey和正式appKey对应相同的包名)之后收不到推送。SDK在初始化过程中有本地请求缓存,更换appKey后需清理本地缓存或卸载测试app重新安装正式app。7、从V2.+版本升级到V3.+版本后接收不到推送。V2.+和V3.+版本在配置上有所区别,详细排查逻辑请参考:移动推送Android SDK:推送从2.+版本升级到3.+版本后,收不到通知/消息 问题仍未解决若上述步骤仍未能定位问题,可以: 加入钉钉群,群号:11795523。或者提交工单,工单请选择类目移动推送。 反馈问题时,请附带下述格式化的问题上下文信息,方便快速定位问题(带*项必填): 您的操作行为:异常的现象:设备的平台(Android?iOS?),机型,系统版本号:推送类型(消息?通知?):推送方式(all? account?device?tag?alias?):* appkey:* 消息ID(控制台可以查到):* deviceid(终端日志可以看到):
2019-12-01 23:32:22 0 浏览量 回答数 0

问题

SSH面试题

1.什么是struts2?struts的工作原理? struts2:1)经典的  mvc (Model  View  Controller) 框架                          ...
琴瑟 2019-12-01 21:46:22 3489 浏览量 回答数 0

回答

Kotlin的简介 Kotlin是由JetBrains公司(IDEA开发者)所开发的编程语言,其名称来自于开发团队附近的科特林岛。 多平台开发 JVM :Android; Server-Side Javascript:前端 Native(beta) :开发原生应用 windows、macos、linux Swift与Kotlin非常像 http://nilhcem.com/swift-is-like-kotlin/ kotlin发展历程 image.png java发展历程 image.png JVM语言的原理 image.png JVM规范与java规范是相互独立的 只要生成的编译文件匹配JVM字节码规范,任何语言都可以由JVM编译运行. Kotlin也是一种JVM语言,完全兼容java,可以与java相互调用;Kotlin语言的设计受到Java、C#、JavaScript、Scala、Groovy等语言的启发 kotlin的特性 下面不会罗列kotlin中具体的语法,会介绍我认为比较重要的特性,以及特性背后的东西。 类型推断 空类型设计 函数式编程 类型推断 image.png 类型推断是指编程语言中在编译期自动推导出值的数据类型。推断类型的能力让很多编程任务变得容易,让程序员可以忽略类型标注的同时仍然允许类型检查。 在开发环境中,我们往往写出表达式,然后可以用快捷键来生成变量声明,往往都是很准的,这说明了编译器其实是可以很准确的推断出来类型的。编程语言所具备的类型推断能力可以把类型声明的任务由开发者转到了编译器. java中声明变量的方式是类型写在最前面,后面跟着变量名,这就迫使开发者在声明变量时就要先思考变量的类型要定义成什么,而在一些情况下比如使用集合、泛型类型的变量,定义类型就会变得比较繁琐。 Kotlin中声明变量,类型可以省略,或者放到变量名后面,这可以降低类型的权重,从必选变为可选,降低开发者思维负担。java10中也引入了类型推断。 Javascript中声明变量也是用关键字var,但是还是有本质区别的,Kotlin中的类型推断并不是变成动态类型、弱类型,类型仍然是在编译期就已经决定了的,Kotlin仍然是静态类型、强类型的编程语言。javascript由于是弱类型语言,同一个变量可以不经过强制类型转换就被赋不同数据类型的值, 编程语言的一个趋势就是抽象程度越来越高,编译器做更多的事情。 空类型设计 空类型的由来 image.png 托尼·霍尔(Tony Hoare),图灵奖得主 托尼·霍尔是ALGOL语言的设计者,该语言在编程语言发展历史上非常重要,对其他编程语言产生重大影响,大多数近代编程语言(包括C语言)皆使用类似ALGOL的语法。他在一次大会上讨论了null应用的设计: “我把 null 引用称为自己的十亿美元错误。它的发明是在1965 年,那时我用一个面向对象语言( ALGOL W )设计了第一个全面的引用类型系统。我加入了null引用设计,仅仅是因为实现起来非常容易。它导致了数不清的错误、漏洞和系统崩溃,可能在之后 40 年中造成了十亿美元的损失。” null引用存在的问题 以java为例,看null引用的设计到底存在哪些问题 空指针问题NPE 编译时不能对空指针做出检查,运行时访问null对象就会出现错误,这个就是工程中常见的空指针异常。 null本身没有语义,会存在歧义 值未被初始化 值不存在 也许表示一种状态 逻辑上有漏洞 Java中,null可以赋值给任何引用,比如赋值给String类型变量,String a = null,但是null并不是String类型: a instanceof String 返回的是false,这个其实是有些矛盾的。所以当持有一个String类型的变量,就存在两种情况,null或者真正的String. 解决NPE的方式 防御式代码 在访问对象前判空,但会有冗余代码;会规避问题,而隐藏真正的问题 抛出异常给调用方处理 方法中传参传入的空值、无效值,抛出受检查异常给上层调用方 增加注解 Android中可以增加@NonNull注解,编译时做额外检查 空状态对象设计模式 空状态对象是一个实现接口但是不做任何业务逻辑的对象,可以取代判空检查;这样的空状态对象也可以在数据不可用的时候提供默认的行为 java8 Optional类 java8中引入了Optional类,来解决广泛存在的null引用问题.官方javadoc文档介绍 A container object which may or may not contain a non-null value. If a value is present, isPresent() will return true and get() will return the value. Additional methods that depend on the presence or absence of a contained value are provided, such as orElse() (return a default value if value not present) and ifPresent() (execute a block of code if the value is present). 来看一下是如何实现的。 举一个访问对象读取熟悉的例子 java 8 之前 : image.png java 8: image.png 总结: 1.用Optional还是会比较繁琐,这个也说明了设计一个替代null的方案还是比较难的。 optional的耗时大约是普通判空的数十倍,主要是涉及泛型、使用时多创键了一个对象的创建;数据比较大时,会造成性能损失。 java8 引入Optional的意义在于提示调用者,用特殊类型包装的变量可能为空,在使用取出时需要判断 Kotlin的空类型设计 Kotlin中引入了可空类型和不可空类型的区分,可以区分一个引用可以容纳null,还是不能容纳null。 String vs String? String 类型表示变量不能为空,String?则表示变量可以为空 String?含义是String or null.这两种是不同的类型. 比如: var a:String = “abc” //ok var a:String = null //不允许 var b :String? = null //ok a=b // 不允许 String?类型的值不能给String类型的值赋值 这样就将类型分成了可空类型和不可能类型,每一个类型都有这样的处理;Kotlin中访问非空类型变量永远不会出现空指针异常。 同样上面的例子,采用Kotlin去写,就会简洁很多 image.png 编程范式-函数式编程 编程范式是什么? 编程范式是程序员看待程序和写程序的观点 主要的类型 非结构化编程 结构化编程 面向对象编程 命令式编程 函数式编程 这些类型并不是彼此互斥的,而是按照不同的维度做的划分,一种编程语言可能都支持多个编程范式 非结构化编程 第一代的高级语言往往是非结构化编程 比如 BASIC语言 每一行的代码前面都有一个数字作为行号,通常使用GOTO的跳跃指令来实现判断和循环. 看一下下面这段代码是做什么的: image.png 实际上做的是:程序在屏幕上显示数字 1 到 10 及其对应的平方 采用这种方式写程序,大量的使用goto实现逻辑的跳转,代码一长,可读性和维护性就比较差了,形成“面条式代码” 结构化编程 采用顺序、分支、循环结构来表达,禁用或者少用GOTO; 并用子程序来组织代码,采用自顶向下的方式来写程序 代表语言是C语言 实现同样的逻辑: image.png 可见采用结构化编程,代码的逻辑会更清晰。 面向对象编程 思想: 将计算机程序视为一组对象的集合,而每个对象都可以接收其他对象发过来的消息,并处理这些消息,计算机程序的执行就是一系列消息在各个对象之间传递。 特性: 封装性、继承性、多态性。 命令式编程 把计算机程序视为一系列的命令集合 主要思想是关注计算机执行的步骤,即一步一步告诉计算机先做什么再做什么。 “先做这,再做那”,强调“怎么做” 实现: 用变量来储存数据,用语句来执行指令,改变变量状态。 基本所有的常见的编程语言都具有此范式 函数式编程 声明式语法,描述要什么,而不是怎么做 类似于SQL语句 语言: kotlin swift python javascript scala 函数是第一等公民 可以赋值给变量,可作为参数传入另一个函数,也可作为函数的返回值 纯函数 y=f(x) 只要输入相同,返回值不变 没有副作用:不修改函数的外部状态 举个栗子 公司部门要进行outing,去哪里是个问题,要考虑多个因素,比如花费、距离、天数等等,有多个备选地点进行选择。 定义一个数据类: image.png 要进行筛选了,分别用sql,kotlin,java来实现 找出花费低于2000元的outing地点信息 SQL image.png Kotlin image.png java 7 image.png 可见kotin的写法还是比较接近于sql的思想的,声明式的写法,而不管具体如何实现;其中的:place->place.money<2000 就是函数,可以作为参数传递给fliter这个高阶函数;而且这个函数没有副作用,不改变外部状态。 再来一个复杂一点的: 找出花费低于5000元,时间不多于4天,按照距离排序的outing地点名称 SQL image.png Kotlin: image.png java 7 image.png 由此可见用kotlin的函数式写法,会更简洁,逻辑也更清晰,这段代码的目标一目了然,这种清晰在于实现了业务逻辑与控制逻辑的分离,业务逻辑就是由函数实现的,比如place->place.money<500,而控制逻辑是由filter,sorterBy等高阶函数实现的。 而java的传统写法是基于对数据的操作,避免不了遍历的操作,业务逻辑与控制逻辑交织在了一起,这段代码的目的就不是那么容易清晰看到的了。 总结 kotlin是实用的现代编程语言,吸收了众多编程语言的优点,支持类型推断、空类型安全、函数式编程、DSL等特性,非常值得学习和使用。
问问小秘 2020-04-30 16:33:40 0 浏览量 回答数 0

问题

如何用Python在笔记本电脑上分析100GB数据?

如何用Python在笔记本电脑上分析100GB数据? 许多组织都试图收集和利用尽可能多的数据,以改进他们如何经营业务、增加收入或如何影响周围的世界。因此,数据科学家面对50GB甚至500GB大小的...
珍宝珠 2020-02-18 12:56:20 1 浏览量 回答数 0

回答

概述 本文主要介绍无法远程连接Windows实例的排查方法。 详细信息 阿里云提醒您: 如果您对实例或数据有修改、变更等风险操作,务必注意实例的容灾、容错能力,确保数据安全。 如果您对实例(包括但不限于ECS、RDS)等进行配置与数据修改,建议提前创建快照或开启RDS日志备份等功能。 如果您在阿里云平台授权或者提交过登录账号、密码等安全信息,建议您及时修改。 无法远程连接Windows实例的原因较多,可通过以下排查方法,排查并解决无法远程连接Windows实例的问题。 步骤一:使用管理终端登录实例 步骤二:登录密码检查 步骤三:端口及安全组检查 步骤四:远程桌面服务检查 步骤五:网络检查 步骤六:检查CPU负载、带宽及内存使用情况 步骤七:防火墙配置检查 步骤八:系统的安全策略设置 步骤九:远程终端服务的配置检查 步骤十:杀毒软件检查 步骤十一:尝试重启实例 常见报错案例 步骤一:使用管理终端登录实例 无论何种原因导致无法远程连接实例,请先尝试用阿里云提供的远程连接功能进行连接,确认实例还有响应,没有完全宕机,然后再按原因分类进行故障排查。 登录ECS管理控制台,单击左侧导航栏中的 实例,在目标实例右侧单击 远程连接。 在首次连接或忘记连接密码时,单击 修改远程连接密码,修改远程连接的密码。 然后通过远程连接密码连接实例。 步骤二:登录密码检查 在确保登录密码正确的情况下,确认之前是否曾重置过密码。检查重置实例密码后是否未重启实例,如果存在实例密码修改记录,但无重启实例记录,则参考以下操作步骤重启实例。 登录ECS管理控制台,单击左侧导航栏中的 实例。 在页面顶部的选择对应的地域,目标实例右侧单击 更多 > 实例状态 > 重启,再单击 确认 即可。 步骤三:端口及安全组检查 进一步检查端口是否正常,以及安全组规则是否有限制。 参考如何查看和修改Windows实例远程桌面的默认端口,检查实例远程链接的端口是否被修改。如果登录方式改变或者ECS安全组规则中未放行修改后的端口号,则参考如下步骤放行修改后的端口。 注:ECS的安全组规则中默认放行3389端口。修改了远程桌面的端口后,需要在安全组规则中放行修改后的端口号。 登录ECS 管理控制台。 找到该实例,单击 管理 进入 实例详情 页面,切换到 本实例安全组 标签页,单击 配置规则。 在安全组规则页面,单击 添加安全组规则。 在弹出的页面中,端口范围 输入修改后的远程桌面端口号。授权对象 输入客户端的公网IP地址。比如修改后的远程桌面端口号为4389,则 端口范围 应输入“4389/4389”。填写完成后,单击 确定。 通过“IP:端口”的方式进行远程桌面连接。连接方式类似如下。 通过上一步获取的端口,参考如下命令,进行端口测试,判断端口是否正常。如果端口测试失败,请参考使用ping命令正常但端口不通时的端口可用性探测说明进行排查。 telnet [$IP] [$Port] 注: [$IP]指Windows实例的IP地址。 [$Port]指Windows实例的RDP端口号。 系统显示类似如下,比如执行telnet 192.168.0.1 4389命令,正常情况下返回结果类似如下。 Trying 192.168.0.1 ... Connected to 192.168.0.1 4389. Escape character is '^]' 检查Windows远程端口设置是否超出范围,如果超出范围,您需将端口重新修改为0到65535之间,且没有被占用的其它端口,具体操作请参考如下操作。 登录实例,依次选择 开始 > 运行,输入 regedit,然后单击 确认。 打开注册表编辑器,依次选择 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server\Wds\rdpwd\Tds\tcp。 双击 PortNumber,单击 十进制,将原端口由“113322”修改为0到65535之间且不与当前端口冲突的端口,例如5588等端口。 注:“113322”为PortNumber右侧显示的端口号。 再打开 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Tenninal Server\WinStations\RDP-Tcp。 双击 PortNumber,单击 十进制,将原端口“113322”修改为与第3步一致的端口号。 然后重启主机,确认远程连接成功。 步骤四:远程桌面服务检查 您可以查看Windows服务器的系统是否开启了远程桌面服务。具体操作如下。 使用控制台远程连接功能登录到Windows实例。 右键单击 我的电脑,选择 属性 > 高级系统设置。 在 系统属性 窗口,选择 远程 选项卡,然后勾选 允许运行任意版本远程桌面的计算机连接 即可。 用户为了提高系统安全性,有时错误的将远程桌面服务所依赖的某些关键服务禁用,导致远程桌面服务异常。可通过以下操作进行检查。 使用控制台远程连接功能登录到Windows实例。 选择 开始 > 运行。 输入msconfig,单击 确定。 在弹出的窗口中,选择 常规 选项卡,选择 正常启动,然后重启服务器即可。 步骤五:网络检查 无法正常远程连接Windows实例时,需要先检查网络是否正常。 用其他网络环境中(不同网段或不同运营商)的电脑连接对比测试,判断是本地网络问题还是服务器端的问题。如果是本地网络问题或运营商问题,请联系本地IT人员或运营商解决。如果是网卡驱动存在异常,则重新安装。排除本地网络故障后进行下一步检查。 在客户端使用ping命令测试与实例的网络连通性。 网络异常时,请参考网络异常时如何抓取数据包进行排查。 当出现ping丢包或ping不通时,请参考使用ping命令丢包或不通时的链路测试方法进行排查。 如果出现间歇性丢包,ECS实例的网络一直处于不稳定状态时,请参考使用ping命令测试ECS实例的IP地址间歇性丢包进行解决。 在实例中使用ping命令测试与客户端的连通性,提示“一般故障”的错误,请参考Windows实例ping外网地址提示“一般故障”进行解决。 步骤六:检查CPU负载、带宽及内存使用情况 确认是否存在CPU负载过高的情况,如果存在,则参考本步骤解决问题,如果不存在,则执行下一步步骤。 检查CPU负载过高时,通过实例详情页面的终端登录实例,检查后台是否正在执行Windows Update操作。 运行Windows Update来安装最新的微软安全补丁。 若应用程序有大量的磁盘访问、网络访问行为、高计算需求,CPU负载过高是正常结果。您可以尝试升配实例规格来解决资源瓶颈问题。 CPU负载过高的解决方法请参见Windows系统ECS实例的CPU使用率较高的解决方法。 无法远程连接可能是公网带宽不足导致的,具体排查方法如下。可通过续费ECS实例,然后重启实例解决。详情参见手动续费或者自动续费。 登录ECS管理控制台。 找到该实例, 单击 管理 进入 实例详情 页面,查看网络监控数据。 检查服务器带宽是否为“1k”或“0k”。如果购买实例时没有购买公网带宽,后来升级了公网带宽,续费的时候没有选择续费带宽,带宽就会变成“1k”。 远程连接输入用户密码登录后,不能正常显示桌面直接退出,也没有错误信息。这种情况可能是服务器内存不足导致的,需要查看一下服务器的内存使用情况。具体操作如下。 使用控制台远程连接功能登录到Windows实例。 选择 开始 > 控制面板 > 管理工具,双击 事件查看器。查看一下是否有内存资源不足的警告日志信息。如有日志信息提示内存不足,具体解决方法参考Windows 虚拟内存不足问题的处理。 步骤七:防火墙配置检查 您只有在已授权可关闭防火墙的情况下,才能进行该项排查。确认防火墙是否已关闭,如果没有关闭,则通过调整防火墙配置策略修复,具体操作请参见如何配置Windows实例远程连接的防火墙。完成操作后,请再进行远程连接,确认连接成功。本文以Windows Server 2012初次登录开启防火墙为例。新购的Windows 2012实例,首次连接服务器是可以的。连接服务器并激活系统后,会提示如下图片中的信息,用户需要单击 是,如果单击 否,服务器会自动开启公网的防火墙,连接会直接断开。此问题可参考以下步骤进行解决。 使用控制台远程连接功能登录到Windows实例。 在菜单栏选择 开始 > 控制面板 。 查看方式 选择 小图标,单击 Windows 防火墙。 在 Windows 防火墙 窗口,单击 高级设置。 在弹出的窗口中,单击 入站规则,在右侧拉至最下方,右键单击 远程桌面-用户模式(TCP-In),选择 启动规则。 返回上一个页面, 单击 Windows 防火墙属性。 选择 启用(推荐),单击 应用。 注意:建议将 域配置文件、专用配置文件、公用配置文件 选项卡下的防火墙全部启用。 更多关于防火墙的设置,请参考设置Windows实例远程连接防火墙。 步骤八:系统的安全策略设置 您可以查看Windows服务器上是否有阻止远程桌面连接的相关安全策略。具体操作如下。 使用控制台远程连接功能登录到Windows实例。 选择 开始 > 控制面板 > 管理工具,双击 本地安全策略。 在弹出的窗口中,单击 IP 安全策略,查看是否有相关的安全策略。 如果有,右键单击相关策略,选择 删除,或双击该IP的安全策略来重新配置以允许远程桌面连接。然后再使用远程桌面连接。 步骤九:远程终端服务的配置检查 无法连接Windows实例远程桌面可能是由于以下远程终端服务的配置异常而导致。 异常一:服务器侧自签名证书损坏 客户端如果是Windows 7以上版本的系统,会尝试与服务器建立TLS连接。若服务器侧用于TLS连接的自签名证书损坏,则会导致远程连接失败。 使用控制台远程连接功能登录到Windows实例。 选择 开始 > 管理工具 > 远程桌面服务,然后双击 远程桌面会话主机配置。 选择 RDP-Tcp。在RDP-Tcp属性窗口,将 安全层 修改成 RDP安全层。 在操作栏单击 禁用连接,再单击 启用连接 即可。 异常二:远程桌面会话主机配置连接被禁用 使用netstat命令查询,发现端口未正常监听。使用控制台远程连接功能登录到Windows实例后,发现远程桌面RDP连接属性配置文件被禁用。参考服务器侧自签名证书损坏找到RDP连接属性配置文件,如果 RDP-Tcp 被禁用,单击 启用连接 即可。 异常三:终端服务器角色配置 用户在使用远程桌面访问Windows实例时,有时会出现如下提示。这种情况一般是由于在服务器上安装配置了 终端服务器,但是没有配置有效的访问授权导致的。可参见如下两个解决方案处理。 Windows服务器远程桌面提示“没有远程桌面授权服务器可以提供许可证”错误 远程登录Windows实例报“远程桌面用户组没有该权限”错误 步骤十:杀毒软件检查 无法连接远程桌面可能是由于第三方杀毒软件设置导致,可通过以下方法进行解决。此处列举两个安全狗配置导致远程访问失败的解决案例。 如果杀毒软件在后台执行,可通过实例详情页面的终端登录,将杀毒软件升级至最新版本或者直接删除。 请使用商业版杀毒软件,或者使用Microsoft Safety Scanner微软免费安全工具,在安全模式下扫描杀毒,相关信息请访问如下链接。 https://www.microsoft.com/security/scanner/zh-cn/default.aspx 案例一:安全狗黑名单拦截 如果安装了安全狗后,出现如下情况,请确认防护软件中是否做了安全设置或对应的拦截。 客户端本地无法远程桌面连接Windows实例,但其他区域可以远程连接。 无法ping通服务器IP地址,且通过tracert命令跟踪路由,发现无法到达服务器。 云盾未拦截本地公网IP地址。 可打开 服务器安全狗 进行检查,选择 网络防火墙。单击 超级黑名单 的 规则设置,如果黑名单中存在实例公网IP,则将此黑名单规则删除,然后将公网IP添加到 超级白名单。 说明:如果云盾的阈值设置过低,则可能拦截实例公网IP。建议把清洗阈值调高,避免出现拦截实例公网IP的情况发生,具体请参见DDoS基础防护。 案例二:安全狗程序异常 使用控制台远程连接功能登录到Windows实例后,在系统桌面右下角,安全狗弹出错误提示,系统显示类似如下。该问题可能是由于安全狗软件出现异常导致的。可通过Windows系统卸载安全狗软件后,重启服务器,网络即可恢复。 步骤十一:尝试重启实例 若用阿里云提供的远程连接功能仍无法成功连接实例,请尝试重启实例。重启操作会使实例停止工作,从而中断业务,请谨慎执行。 提示:重启实例前,需给实例创建快照,用于数据备份或者制作镜像。创建快照的方法请参见创建快照。 登录ECS 管理控制台,单击左侧导航栏中的 实例。 在页面顶部的选择对应的地域,在目标实例右侧单击 更多 > 实例状态 > 重启,再单击 确认 即可。
1934890530796658 2020-03-25 22:43:56 0 浏览量 回答数 0

回答

Go 的优势在于能够将简单的和经过验证的想法结合起来,同时避免了其他语言中出现的许多问题。本文概述了 Go 背后的一些设计原则和工程智慧,作者认为,Go 语言具备的所有这些优点,将共同推动其成为接替 Java 并主导下一代大型软件开发平台的最有力的编程语言候选。很多优秀的编程语言只是在个别领域比较强大,如果将所有因素都纳入考虑,没有其他语言能够像 Go 语言一样“全面开花”,在大型软件工程方面,尤为如此。 基于现实经验 Go 是由经验丰富的软件行业老手一手创建的,长期以来,他们对现有语言的各种缺点有过切身体会的痛苦经历。几十年前,Rob Pike 和 Ken Thompson 在 Unix、C 和 Unicode 的发明中起到了重要作用。Robert Griensemer 在为 JavaScript 和 Java 开发 V8 和 HotSpot 虚拟机之后,在编译器和垃圾收集方面拥有数十年的经验。有太多次,他们不得不等待 Google 规模的 C++/Java 代码库进行编译。于是,他们开始着手创建新的编程语言,将他们半个世纪以来的编写代码所学到的一切经验包含进去。 专注于大型工程 小型工程项目几乎可以用任何编程语言来成功构建。当成千上万的开发人员在数十年的持续时间压力下,在包含数千万行代码的大型代码库上进行协作时,就会发生真正令人痛苦的问题。这样会导致一些问题,如下: 较长的编译时间导致中断开发。代码库由几个人 / 团队 / 部门 / 公司所拥有,混合了不同的编程风格。公司雇佣了数千名工程师、架构师、测试人员、运营专家、审计员、实习生等,他们需要了解代码库,但也具备广泛的编码经验。依赖于许多外部库或运行时,其中一些不再以原始形式存在。在代码库的生命周期中,每行代码平均被重写 10 次,被弄得千疮百痍,而且还会发生技术偏差。文档不完整。 Go 注重减轻这些大型工程的难题,有时会以使小型工程变得更麻烦为代价,例如,代码中到处都需要几行额外的代码行。 注重可维护性 Go 强调尽可能多地将工作转给自动化的代码维护工具中。Go 工具链提供了最常用的功能,如格式化代码和导入、查找符号的定义和用法、简单的重构以及代码异味的识别。由于标准化的代码格式和单一的惯用方式,机器生成的代码更改看起来非常接近 Go 中人为生成的更改并使用类似的模式,从而允许人机之间更加无缝地协作。 保持简单明了 初级程序员为简单的问题创建简单的解决方案。高级程序员为复杂的问题创建复杂的解决方案。伟大的程序员找到复杂问题的简单解决方案。 ——Charles Connell 让很多人惊讶的一点是,Go 居然不包含他们喜欢的其他语言的概念。Go 确实是一种非常小巧而简单的语言,只包含正交和经过验证的概念的最小选择。这鼓励开发人员用最少的认知开销来编写尽可能简单的代码,以便许多其他人可以理解并使用它。 使事情清晰明了 良好的代码总是显而易见的,避免了那些小聪明、难以理解的语言特性、诡异的控制流和兜圈子。 许多语言都致力提高编写代码的效率。然而,在其生命周期中,人们阅读代码的时间却远远超过最初编写代码所需的时间(100 倍)。例如,审查、理解、调试、更改、重构或重用代码。在查看代码时,往往只能看到并理解其中的一小部分,通常不会有完整的代码库概述。为了解释这一点,Go 将所有内容都明确出来。 错误处理就是一个例子。让异常在各个点中断代码并在调用链上冒泡会更容易。Go 需要手动处理和返回每个错误。这使得它可以准确地显示代码可以被中断的位置以及如何处理或包装错误。总的来说,这使得错误处理编写起来更加繁琐,但是也更容易理解。 简单易学 Go 是如此的小巧而简单,以至于人们可以在短短几天内就能研究通整个语言及其基本概念。根据我们的经验,培训用不了一个星期(相比于掌握其他语言需要几个月),初学者就能够理解 Go 专家编写的代码,并为之做出贡献。为了方便吸引更多的用户,Go 网站提供了所有必要的教程和深入研究的文章。这些教程在浏览器中运行,允许人们在将 Go 安装到本地计算机上之前就能够学习和使用 Go。 解决之道 Go 强调的是团队之间的合作,而不是个人的自我表达。 在 Go(和 Python)中,所有的语言特性都是相互正交和互补的,通常有一种方法可以做一些事情。如果你想让 10 个 Python 或 Go 程序员来解决同一个问题,你将会得到 10 个相对类似的解决方案。不同的程序员在彼此的代码库中感觉更自在。在查看其他人的代码时,国骂会更少,而且人们的工作可以更好地融合在一起,从而形成了一致的整体,人人都为之感到自豪,并乐于工作。这还避免了大型工程的问题,如: 开发人员认为良好的工作代码很“混乱”,并要求在开始工作之前进行重写,因为他们的思维方式与原作者不同。 不同的团队成员使用不同的语言子集来编写相同代码库的部分内容。 ![image.png](https://ucc.alicdn.com/pic/developer-ecology/e64418f1455d46aaacfdd03fa949f16d.png) 简单、内置的并发性 Go 专为现代多核硬件设计。 目前使用的大多数编程语言(Java、JavaScript、Python、Ruby、C、C++)都是 20 世纪 80 年代到 21 世纪初设计的,当时大多数 CPU 只有一个计算内核。这就是为什么它们本质上是单线程的,并将并行化视为边缘情况的马后炮。通过现成和同步点之类的附加组件来实现,而这些附加组件既麻烦又难以正确使用。第三方库虽然提供了更简单的并发形式,如 Actor 模型,但是总有多个可用选项,结果导致了语言生态系统的碎片化。今天的硬件拥有越来越多的计算内核,软件必须并行化才能高效运行。Go 是在多核处理器时代编写的,并且在语言中内置了简单、高级的 CSP 风格并发性。 面向计算的语言原语 就深层而言,计算机系统接收数据,对其进行处理(通常要经过几个步骤),然后输出结果数据。例如,Web 服务器从客户端接收 HTTP 请求,并将其转换为一系列数据库或后端调用。一旦这些调用返回,它就将接收到的数据转换成 HTML 或 JSON 并将其输出给调用者。Go 的内置语言原语直接支持这种范例: 结构表示数据 读和写代表流式 IO 函数过程数据 goroutines 提供(几乎无限的)并发性 在并行处理步骤之间传输管道数据 因为所有的计算原语都是由语言以直接形式提供的,因此 Go 源代码更直接地表达了服务器执行的操作。 OO — 好的部分 更改基类中的某些内容的副作用 面向对象非常有用。过去几十年来,面向对象的使用富有成效,并让我们了解了它的哪些部分比其他部分能够更好地扩展。Go 在面向对象方面采用了一种全新的方法,并记住了这些知识。它保留了好的部分,如封装、消息传递等。Go 还避免了继承,因为它现在被认为是有害的,并为组合提供了一流的支持。 现代标准库 目前使用的许多编程语言(Java、JavaScript、Python、Ruby)都是在互联网成为当今无处不在的计算平台之前设计的。因此,这些语言的标准库只提供了相对通用的网络支持,而这些网络并没有针对现代互联网进行优化。Go 是十年前创建的,当时互联网已全面发展。Go 的标准库允许在没有第三方库的情况下创建更复杂的网络服务。这就避免了第三方库的常见问题: 碎片化:总是有多个选项实现相同的功能。 膨胀:库常常实现的不仅仅是它们的用途。 依赖地狱:库通常依赖于特定版本的其他库。 未知质量:第三方代码的质量和安全性可能存在问题。 未知支持:第三方库的开发可能随时停止支持。 意外更改:第三方库通常不像标准库那样严格地进行版本控制。 关于这方面更多的信息请参考 Russ Cox 提供的资料 标准化格式 Gofmt 的风格没有人会去喜欢,但人人都会喜欢 gofmt。 ——Rob Pike Gofmt 是一种以标准化方式来格式化 Go 代码的程序。它不是最漂亮的格式化方式,但却是最简单、最不令人生厌的格式化方式。标准化的源代码格式具有惊人的积极影响: 集中讨论重要主题: 它消除了围绕制表符和空格、缩进深度、行长、空行、花括号的位置等一系列争论。 开发人员在彼此的代码库中感觉很自在, 因为其他代码看起来很像他们编写的代码。每个人都喜欢自由地按照自己喜欢的方式进行格式化代码,但如果其他人按照自己喜欢的方式格式化了代码,这么做很招人烦。 自动代码更改并不会打乱手写代码的格式,例如引入了意外的空白更改。 许多其他语言社区现在正在开发类似 gofmt 的东西。当作为第三方解决方案构建时,通常会有几个相互竞争的格式标准。例如,JavaScript 提供了 Prettier 和 StandardJS。这两者都可以用,也可以只使用其中的一个。但许多 JS 项目并没有采用它们,因为这是一个额外的决策。Go 的格式化程序内置于该语言的标准工具链中,因此只有一个标准,每个人都在使用它。 快速编译 ![image.png](https://ucc.alicdn.com/pic/developer-ecology/8a76f3f07f484266af42781d9e7b8692.png) 对于大型代码库来说,它们长时间的编译是促使 Go 诞生的原因。Google 主要使用的是 C++ 和 Java,与 Haskell、Scala 或 Rust 等更复杂的语言相比,它们的编译速度相对较快。尽管如此,当编译大型代码库时,即使是少量的缓慢也会加剧编译的延迟,从而激怒开发人员,并干扰流程。Go 的设计初衷是为了提高编译效率,因此它的编译器速度非常快,几乎没有编译延迟的现象。这给 Go 开发人员提供了与脚本类语言类似的即时反馈,还有静态类型检查的额外好处。 交叉编译 由于语言运行时非常简单,因此它被移植到许多平台,如 macOS、Linux、Windows、BSD、ARM 等。Go 可以开箱即用地为所有这些平台编译二进制文件。这使得从一台机器进行部署变得很容易。 快速执行 Go 的运行速度接近于 C。与 JITed 语言(Java、JavaScript、Python 等)不同,Go 二进制文件不需要启动或预热的时间,因为它们是作为编译和完全优化的本地代码的形式发布的。Go 的垃圾收集器仅引入微秒量级的可忽略的停顿。除了快速的单核性能外,Go 还可以轻松利用所有的 CPU 内核。 内存占用小 像 JVM、Python 或 Node 这样的运行时不仅仅在运行时加载程序代码,每次运行程序时,它们还会加载大型且高度复杂的基础架构,以进行编译和优化程序。如此一来,它们的启动时间就变慢了,并且还占用了大量内存(数百兆字节)。而 Go 进程的开销更小,因为它们已经完全编译和优化,只需运行即可。Go 还以非常节省内存的方式来存储数据。在内存有限且昂贵的云环境中,以及在开发过程中,这一点非常重要。我们希望在一台机器上能够快速启动整个堆栈,同时将内存留给其他软件。 部署规模小 Go 的二进制文件大小非常简洁。Go 应用程序的 Docker 镜像通常比用 Java 或 Node 编写的等效镜像要小 10 倍,这是因为它无需包含编译器、JIT,以及更少的运行时基础架构的原因。这些特点,在部署大型应用程序时很重要。想象一下,如果要将一个简单的应用程序部署到 100 个生产服务器上会怎么样?如果使用 Node/JVM 时,我们的 Docker 注册表就必须提供 100 个 docker 镜像,每个镜像 200MB,那么一共就需要 20GB。要完成这些部署就需要一些时间。想象一下,如果我们想每天部署 100 次的话,如果使用 Go 服务,那么 Docker 注册表只需提供 10 个 docker 镜像,每个镜像只有 20MB,共只需 2GB 即可。大型 Go 应用程序可以更快、更频繁地部署,从而使得重要更新能够更快地部署到生产环境中。 独立部署 Go 应用程序部署为一个包含所有依赖项的单个可执行文件,并无需安装特定版本的 JVM、Node 或 Python 运行时;也不必将库下载到生产服务器上,更无须对运行 Go 二进制文件的机器进行任何更改。甚至也不需要讲 Go 二进制文件包装到 Docker 来共享他们。你需要做的是,只是将 Go 二进制文件放到服务器上,它就会在那里运行,而不用关心服务器运行的是什么。前面所提到的那些,唯一的例外是使用net和os/user包时针对对glibc的动态链接。 供应依赖关系 Go 有意识避免使用第三方库的中央存储库。Go 应用程序直接链接到相应的 Git 存储库,并将所有相关代码下载(供应)到自己的代码库中。这样做有很多好处: 在使用第三方代码之前,我们可以对其进行审查、分析和测试。该代码就和我们自己的代码一样,是我们应用程序的一部分,应该遵循相同的质量、安全性和可靠性标准。 无需永久访问存储依赖项的各个位置。从任何地方(包括私有 Git repos)获取第三方库,你就能永久拥有它们。 经过验收后,编译代码库无需进一步下载依赖项。 若互联网某处的代码存储库突然提供不同的代码,这也并不足为奇。 即使软件包存储库速度变慢,或托管包不复存在,部署也不会因此中断。 兼容性保证 Go 团队承诺现有的程序将会继续适用于新一代语言。这使得将大型项目升级到最新版本的编译器会非常容易,并且可从它们带来的许多性能和安全性改进中获益。同时,由于 Go 二进制文件包含了它们需要的所有依赖项,因此可以在同一服务器上并行运行使用不同版本的 Go 编译器编译的二进制文件,而无需进行复杂的多个版本的运行时设置或虚拟化。 文档 在大型工程中,文档对于使软件可访问性和可维护性非常重要。与其他特性类似,Go 中的文档简单实用: 由于它是嵌入到源代码中的,因此两者可以同时维护。 它不需要特殊的语法,文档只是普通的源代码注释。 可运行单元测试通常是最好的文档形式。因此 Go 要求将它们嵌入到文档中。 所有的文档实用程序都内置在工具链中,因此每个人都使用它们。 Go linter 需要导出元素的文档,以防止“文档债务”的积累。 商业支持的开源 当商业实体在开放式环境下开发时,那么一些最流行的、经过彻底设计的软件就会出现。这种设置结合了商业软件开发的优势——一致性和精细化,使系统更为健壮、可靠、高效,并具有开放式开发的优势,如来自许多行业的广泛支持,多个大型实体和许多用户的支持,以及即使商业支持停止的长期支持。Go 就是这样发展起来的。 缺点 当然,Go 也并非完美无缺,每种技术选择都是有利有弊。在决定选择 Go 之前,有几个方面需要进行考虑考虑。 未成熟 虽然 Go 的标准库在支持许多新概念(如 HTTP 2 Server push 等)方面处于行业领先地位,但与 JVM 生态系统中的第三方库相比,用于外部 API 的第三方 Go 库可能不那么成熟。 即将到来的改进 由于清楚几乎不可能改变现有的语言元素,Go 团队非常谨慎,只在新特性完全开发出来后才添加新特性。在经历了 10 年的有意稳定阶段之后,Go 团队正在谋划对语言进行一系列更大的改进,作为 Go 2.0 之旅的一部分。 无硬实时 虽然 Go 的垃圾收集器只引入了非常短暂的停顿,但支持硬实时需要没有垃圾收集的技术,例如 Rust。 结语 本文详细介绍了 Go 语言的一些优秀的设计准则,虽然有的准则的好处平常看起来没有那么明显。但当代码库和团队规模增长几个数量级时,这些准则可能会使大型工程项目免于许多痛苦。总的来说,正是这些设计准则让 Go 语言成为了除 Java 之外的编程语言里,用于大型软件开发项目的绝佳选择。
有只黑白猫 2020-01-07 14:11:38 0 浏览量 回答数 0

问题

详解 Spring 3.0 基于 Annotation 的依赖注入实现 配置报错 

作者:张 建平, 项目经理, iSoftStone Co.,Ltd 简介: Spring 的依赖配置方式与 Spring 框架的内核自身是松耦合设计的。然而,直到 Spring 3.0 以前...
kun坤 2020-06-01 09:44:47 3 浏览量 回答数 1

问题

支付宝的性能测试

       一、性能测试支付宝场景介绍   2013年双11过程当中,促销开启的第一分钟内支付宝的交易总额就突破了一亿元,短时间内大量用户涌入的情况下,如何保证用户的支付顺畅,...
云效平台 2019-12-01 21:47:13 5472 浏览量 回答数 1

回答

首次接入推送不成功 1、遇到问题可以先通过文档页进行关键字检索,一般都能命中相关的疑问。 2、检查推送通道是否初始化成功,确保您在初始化时注册的回调函数onSuccess能够被成功调用。 3、如果推送通道初始化失败:请查看错误日志以及错误码,按照错误提醒检查appkey,appSecret等相关配置。 4、如果发送的是消息,客户端不会通知栏弹出展示,需要客户端实现消息回调,自定义消息的展示方式。 5、使用官方demo体验,,排除自身配置问题。使用官方demo时需要设置您自己的appKey,appSecret并修改包名。如果使用官方demo无问题,请确认下自己的实现和demo的区别。 6、如果您的设备集成上阿里云移动推送Android SDK,端上日志显示初始化成功,控制台显示设备在线,但是总是推送失败,请检查以下参数是否符合规范: 请检查您的APP的versionName参数,versionName参数不能为null,同时长度不能超过32位。如果versionName参数不符合要求,请更改versionName参数。 修改后务必先卸载原有App然后重新安装,不要直接覆盖安装。 7、如果集成成功,向设备推送通知,排查系统显示已到达,但设备端并未弹窗显示。请确认推送的是通知还是消息,只有通知才会在通知栏创建通知,消息不会创建通知,需要用户在SDK端的onMessage接口中自行处理。 8、推送消息,设备端日志显示已经收到推送,但用户回调未被调用。推送消息在端上的路由过程涉及到发送应用内广播,部分设备存在广播拦截,请确认您的设备是否存在该问题: 1.正常情况下的日志: 第一条handleRemoteMessage日志说明消息已经到达端上,第二条AgooMessageReceiver日志表明用户自定义Receiver已经接收到广播。 2.如果只有第一条日志,未出现第二条日志则说明receiver没有正常接收到广播,需要测试设备是否会拦截广播。测试代码如下: Intent intent = new Intent(); intent.setAction("org.agoo.android.intent.action.RECEIVE"); intent.setPackage(pack);//pack为应用包名 intent.putExtra("type", "common-push"); intent.addFlags(32); context.sendBroadcast(intent);//请使用ApplicationContext进行测试 利用上述代码给您的自定义receiver发送广播,测试Receiver是否可以收到对应广播,如果还是收不到则说明存在广播拦截情况。 3.如果存在拦截情况,请确认你的设备是否不允许监听系统广播:在manifest.xml文件中将自定义receiver所监听的系统广播注释掉,具体操作如下文代码所示: <receiver android:name=".demo.MyMessageReceiver" android:exported="true"> <intent-filter> <action android:name="com.alibaba.push2.action.NOTIFICATION_OPENED" /> </intent-filter> <intent-filter> <action android:name="com.alibaba.push2.action.NOTIFICATION_REMOVED" /> </intent-filter> <intent-filter> <action android:name="com.taobao.accs.intent.action.COMMAND" /> </intent-filter> <intent-filter> <action android:name="com.taobao.taobao.intent.action.COMMAND" /> </intent-filter> <intent-filter> <action android:name="org.agoo.android.intent.action.RECEIVE" /> </intent-filter> <!--<intent-filter>--> <!--<action android:name="android.net.conn.CONNECTIVITY_CHANGE" />--> <!--</intent-filter>--> <!--<intent-filter>--> <!--<action android:name="android.intent.action.USER_PRESENT" />--> <!--</intent-filter>--> <!--<intent-filter>--> <!--<action android:name="android.intent.action.BOOT_COMPLETED" />--> <!--</intent-filter>--> <!--<intent-filter>--> <!--<action android:name="android.intent.action.PACKAGE_REMOVED" />--> <!--<data android:scheme="package" />--> <!--</intent-filter>--> </receiver> 重复步骤2的操作,观察是否会可以成功接收广播。如果可以则说明您的设备rom不允许监听系统广播。当前receiver不监听系统广播不影响功能的正常使用,但会影响SDK的保活能力。 9、- 设备绑定标签后,服务端按该标签推送,隔天(T + 1)才能生效送达,参考Android API介绍 - 标签API。 已经接入成功,突然出现异常 1、推送通知,如果有设备能收到,有设备不能收到,请检查不能收到通知设备的手机设置情况,是否将推送App的通知弹出做了限制。 2、如果出现应用处于前台可以收到推送,应用退到后台后无法接收到推送。请检查channel进程是否执行了推送初始化操作。 1.判断channel是否执行初始化方法:查看channel进程是否有如下日志输出,如无则表示未执行相应初始化操作 12-26 11:26:19.673 1951-1951/com.alibaba.push2:channel I/SecurityBoxService: Aliyun 12-26 11:26:19.677 1951-1951/com.alibaba.push2:channel I/MPS:CloudPushService: [AMS]Initialize Mobile Push service... 12-26 11:26:19.727 1951-1951/com.alibaba.push2:channel D/MPS:CloudPushService: load utdid: Vs6CkGxR86QDANku3NiLD/yA 12-26 11:26:19.743 1951-1951/com.alibaba.push2:channel D/MPS:AppRegister: getLooper called. 12-26 11:26:19.744 1951-1989/com.alibaba.push2:channel D/MPS:AppRegister: Looping Prepared. 12-26 11:26:19.744 1951-1989/com.alibaba.push2:channel D/MPS:AppRegister: Looping handleMessage: 1 12-26 11:26:19.747 1951-1989/com.alibaba.push2:channel D/MPS:AppRegister: accs init. 12-26 11:26:19.747 1951-1989/com.alibaba.push2:channel D/MPS:AppRegister: initAccsChannel... 12-26 11:26:19.748 1951-1989/com.alibaba.push2:channel I/MPS:AppRegister: [AMS]appkey:23552881 2.常见错误: (1) 用户在自定义Application中执行推送SDK初始化时做了进程判断,导致初始化操作只在主进程执行。错误代码如下所示: public class MyApplication extends Application { @override public void onCreate() { super.onCreate(); if(如果是主进程) { initCloudChannel(this); } } ...... } (2) 用户在activity中进行相关初始化,activity只会在主进程创建,导致相关操作只能在主进程执行。错误代码如下所示: public class MyActivity extends Activity { @override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); initCloudChannel(getApplicationContext()); ...... } ...... } 3、部分ROM对应用自动拉起管控较严格,如果您的设备是小米或者华为,且当前应用被杀死,建议配置小米和华为辅助通道以及小米托管弹窗,可以提升到达率。相关文档:小米/华为系统推送支持 4、利用推送排查系统排错。排错方法:获取设备deviceId,对deviceId单独推送一条,在排查系统查看相关信息。如下图: 5、如果推送排查页面显示未知错误,请确认测试设备是否关闭了推送通道即是否调用过turnOffPushChannel接口。如果是,必须再次调用turnOnPushChannel接口重新打开推送通道。 6、用测试appKey测试正常,切换成正式appKey(测试appKey和正式appKey对应相同的包名)之后收不到推送。SDK在初始化过程中有本地请求缓存,更换appKey后需清理本地缓存或卸载测试app重新安装正式app。 7、从V2.+版本升级到V3.+版本后接收不到推送。V2.+和V3.+版本在配置上有所区别,详细排查逻辑请参考:移动推送Android SDK:推送从2.+版本升级到3.+版本后,收不到通知/消息 问题仍未解决 若上述步骤仍未能定位问题,可以: 加入钉钉群,群号:11795523。 或者提交工单,工单请选择类目移动推送。 反馈问题时,请附带下述格式化的问题上下文信息,方便快速定位问题(带*项必填): 您的操作行为: 异常的现象: 设备的平台(Android?iOS?),机型,系统版本号: 推送类型(消息?通知?): 推送方式(all? account?device?tag?alias?): * appkey: * 消息ID(控制台可以查到): * deviceid(终端日志可以看到):
保持可爱mmm 2020-03-30 09:49:19 0 浏览量 回答数 0

回答

首次接入推送不成功 1、遇到问题可以先通过文档页进行关键字检索,一般都能命中相关的疑问。 2、检查推送通道是否初始化成功,确保您在初始化时注册的回调函数onSuccess能够被成功调用。 3、如果推送通道初始化失败:请查看错误日志以及错误码,按照错误提醒检查appkey,appSecret等相关配置。 4、如果发送的是消息,客户端不会通知栏弹出展示,需要客户端实现消息回调,自定义消息的展示方式。 5、使用官方demo体验,,排除自身配置问题。使用官方demo时需要设置您自己的appKey,appSecret并修改包名。如果使用官方demo无问题,请确认下自己的实现和demo的区别。 6、如果您的设备集成上阿里云移动推送Android SDK,端上日志显示初始化成功,控制台显示设备在线,但是总是推送失败,请检查以下参数是否符合规范: 请检查您的APP的versionName参数,versionName参数不能为null,同时长度不能超过32位。如果versionName参数不符合要求,请更改versionName参数。 修改后务必先卸载原有App然后重新安装,不要直接覆盖安装。 7、如果集成成功,向设备推送通知,排查系统显示已到达,但设备端并未弹窗显示。请确认推送的是通知还是消息,只有通知才会在通知栏创建通知,消息不会创建通知,需要用户在SDK端的onMessage接口中自行处理。 8、推送消息,设备端日志显示已经收到推送,但用户回调未被调用。推送消息在端上的路由过程涉及到发送应用内广播,部分设备存在广播拦截,请确认您的设备是否存在该问题: 1.正常情况下的日志: 第一条handleRemoteMessage日志说明消息已经到达端上,第二条AgooMessageReceiver日志表明用户自定义Receiver已经接收到广播。 2.如果只有第一条日志,未出现第二条日志则说明receiver没有正常接收到广播,需要测试设备是否会拦截广播。测试代码如下: Intent intent = new Intent(); intent.setAction("org.agoo.android.intent.action.RECEIVE"); intent.setPackage(pack);//pack为应用包名 intent.putExtra("type", "common-push"); intent.addFlags(32); context.sendBroadcast(intent);//请使用ApplicationContext进行测试 利用上述代码给您的自定义receiver发送广播,测试Receiver是否可以收到对应广播,如果还是收不到则说明存在广播拦截情况。 3.如果存在拦截情况,请确认你的设备是否不允许监听系统广播:在manifest.xml文件中将自定义receiver所监听的系统广播注释掉,具体操作如下文代码所示: <receiver android:name=".demo.MyMessageReceiver" android:exported="true"> <intent-filter> <action android:name="com.alibaba.push2.action.NOTIFICATION_OPENED" /> </intent-filter> <intent-filter> <action android:name="com.alibaba.push2.action.NOTIFICATION_REMOVED" /> </intent-filter> <intent-filter> <action android:name="com.taobao.accs.intent.action.COMMAND" /> </intent-filter> <intent-filter> <action android:name="com.taobao.taobao.intent.action.COMMAND" /> </intent-filter> <intent-filter> <action android:name="org.agoo.android.intent.action.RECEIVE" /> </intent-filter> <!--<intent-filter>--> <!--<action android:name="android.net.conn.CONNECTIVITY_CHANGE" />--> <!--</intent-filter>--> <!--<intent-filter>--> <!--<action android:name="android.intent.action.USER_PRESENT" />--> <!--</intent-filter>--> <!--<intent-filter>--> <!--<action android:name="android.intent.action.BOOT_COMPLETED" />--> <!--</intent-filter>--> <!--<intent-filter>--> <!--<action android:name="android.intent.action.PACKAGE_REMOVED" />--> <!--<data android:scheme="package" />--> <!--</intent-filter>--> </receiver> 重复步骤2的操作,观察是否会可以成功接收广播。如果可以则说明您的设备rom不允许监听系统广播。当前receiver不监听系统广播不影响功能的正常使用,但会影响SDK的保活能力。 9、- 设备绑定标签后,服务端按该标签推送,隔天(T + 1)才能生效送达,参考Android API介绍 - 标签API。 已经接入成功,突然出现异常 1、推送通知,如果有设备能收到,有设备不能收到,请检查不能收到通知设备的手机设置情况,是否将推送App的通知弹出做了限制。 2、如果出现应用处于前台可以收到推送,应用退到后台后无法接收到推送。请检查channel进程是否执行了推送初始化操作。 1.判断channel是否执行初始化方法:查看channel进程是否有如下日志输出,如无则表示未执行相应初始化操作 12-26 11:26:19.673 1951-1951/com.alibaba.push2:channel I/SecurityBoxService: Aliyun 12-26 11:26:19.677 1951-1951/com.alibaba.push2:channel I/MPS:CloudPushService: [AMS]Initialize Mobile Push service... 12-26 11:26:19.727 1951-1951/com.alibaba.push2:channel D/MPS:CloudPushService: load utdid: Vs6CkGxR86QDANku3NiLD/yA 12-26 11:26:19.743 1951-1951/com.alibaba.push2:channel D/MPS:AppRegister: getLooper called. 12-26 11:26:19.744 1951-1989/com.alibaba.push2:channel D/MPS:AppRegister: Looping Prepared. 12-26 11:26:19.744 1951-1989/com.alibaba.push2:channel D/MPS:AppRegister: Looping handleMessage: 1 12-26 11:26:19.747 1951-1989/com.alibaba.push2:channel D/MPS:AppRegister: accs init. 12-26 11:26:19.747 1951-1989/com.alibaba.push2:channel D/MPS:AppRegister: initAccsChannel... 12-26 11:26:19.748 1951-1989/com.alibaba.push2:channel I/MPS:AppRegister: [AMS]appkey:23552881 2.常见错误: (1) 用户在自定义Application中执行推送SDK初始化时做了进程判断,导致初始化操作只在主进程执行。错误代码如下所示: public class MyApplication extends Application { @override public void onCreate() { super.onCreate(); if(如果是主进程) { initCloudChannel(this); } } ...... } (2) 用户在activity中进行相关初始化,activity只会在主进程创建,导致相关操作只能在主进程执行。错误代码如下所示: public class MyActivity extends Activity { @override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); initCloudChannel(getApplicationContext()); ...... } ...... } 3、部分ROM对应用自动拉起管控较严格,如果您的设备是小米或者华为,且当前应用被杀死,建议配置小米和华为辅助通道以及小米托管弹窗,可以提升到达率。相关文档:小米/华为系统推送支持 4、利用推送排查系统排错。排错方法:获取设备deviceId,对deviceId单独推送一条,在排查系统查看相关信息。如下图: 5、如果推送排查页面显示未知错误,请确认测试设备是否关闭了推送通道即是否调用过turnOffPushChannel接口。如果是,必须再次调用turnOnPushChannel接口重新打开推送通道。 6、用测试appKey测试正常,切换成正式appKey(测试appKey和正式appKey对应相同的包名)之后收不到推送。SDK在初始化过程中有本地请求缓存,更换appKey后需清理本地缓存或卸载测试app重新安装正式app。 7、从V2.+版本升级到V3.+版本后接收不到推送。V2.+和V3.+版本在配置上有所区别,详细排查逻辑请参考:移动推送Android SDK:推送从2.+版本升级到3.+版本后,收不到通知/消息 问题仍未解决 若上述步骤仍未能定位问题,可以: 加入钉钉群,群号:11795523。 或者提交工单,工单请选择类目移动推送。 反馈问题时,请附带下述格式化的问题上下文信息,方便快速定位问题(带*项必填): 您的操作行为: 异常的现象: 设备的平台(Android?iOS?),机型,系统版本号: 推送类型(消息?通知?): 推送方式(all? account?device?tag?alias?): * appkey: * 消息ID(控制台可以查到): * deviceid(终端日志可以看到):
保持可爱mmm 2020-03-30 09:48:07 0 浏览量 回答数 0

回答

2014年12月第2周 1)SLB植入cookie和SLB重写cookie有什么区别? cookie植入,表示直接由SLB系统来分配和管理对客户端进行的cookie植入操作,用户在进行配置时 需要指定会话保持的超时时间; cookie重写,表示SLB系统会根据用户自定义cookie名称来分配和管理对客户端进行的cookie植入操 作,便于用户识别和区分自定义的cookie名称 http://help.aliyun.com/doc/view/13510025.html?spm=0.0.0.0.vwbsGF 2)SLB有没有对外提供API接口,因为我想做到用程序自动去控制SLB的操作? SLB api您可以参考http://help.aliyun.com/view/13621674.html? spm=5176.7114037.1996646101.1.9RoTFM&pos=1 3)使用slb怎么实现数据的单向同步和双向同步? 单向同步可以使用rsync,双向同步的话rsync需要借用别的服务来实现,如unison+inotify。 4)slb的vip是否可以实现远程登录? slb 的vip无法实现远程登录。 5)slb的带宽是所有后端ECS服务器的带宽总和吗? 不是,使您购买的slb实例带宽。 6)slb健康检查机制是什么? 用户开启健康检查功能后,当后端某个ECS健康检查出现问题时会将请求转发到其他健康检查正常的 ECS上,而当该ECS恢复正常运行时,SLB会将其自动恢复到对外或对内的服务中。 针对7层(HTTP协议)服务,SLB系统的健康检查机制为:默认通过SLB的后端系统来向该ECS应用服务 器配置的缺省首页发起http head请求(缺省通过在服务监听配置中指定的后端ECS端口进行访问), 返回200 OK后将视为后端ECS运行正常,否则视为后端ECS运行异常。如果用户用来进行健康检查的页 面并不是应用服务器的缺省首页,那么需要用户指定相应的URI。如果用户对http head请求限定了 host字段的参数,那么需要用户指定相应的URL。用户也可以通过设定健康检查的频率、健康阈值和 不健康阈值来更好的控制健康检查功能。 针对4层(TCP协议)服务,SLB系统的健康检查机制为:默认通过在服务监听配置中指定的后端ECS端 口发起访问请求,如果端口访问正常则视为后端ECS运行正常,否则视为后端ECS运行异常。 当用户后端ECS健康检查异常后,SLB系统会将该ECS的转发权重设置为0,从而确保新的连接不会再被 转发到该ECS上,而已经建立的连接的请求却不会被直接断掉。 针对可能引起健康检查异常的排查思路点击这里查看。 关于健康检查的参数配置,提供如下参考建议: 响应超时时间:5秒 健康检查间隔:2秒 不健康阈值:3 健康阈值:3 7)权重设置为0怎么办? 权重为0的服务器将无法提供服务。 8)健康检查异常的排查思路? 参考http://help.aliyun.com/doc/view/13510029.html?spm=0.0.0.0.Oa9Ezv ------------------------- 12月份第3周1)轮询与最小连接数方式的区别是什么?当前SLB支持轮询和最小连接数2种模式的转发规则。“轮询模式”会将外部和内部的访问请求依序分发给后端ECS进行处理,而“最小连接数模式”会将外部和内部的访问请求分发给当前连接数最小的一台后端ECS进行处理。2)SLB支持redis的主备?目前我们的SLB不支持主备模式(冷备),只支持"轮询"和"最小连接数"两种负载模式。关于SLB的原理您可以参阅如下博文:http://blog.aliyun.com/149 基于ECS的redis搭建,您可以参阅论坛中其它用户的分享案例:http://bbs.aliyun.com/read/161389.html3)负载均衡的多台服务器之间文件会不会自动同步?slb是不会自动同步的,需要您自行配置。4)四层和七层检查的区别是什么?如果是4层(TCP)配置,健康检查只是简单的TCP握手,不会真正去访问您的业务。但对于7层(HTTP)配置,会发HTTP请求(类似于正常访问),并根据返回状态码判断服务状态(2XX表示服务正常)。5)我有多个slb,之前一个slb由于被攻击被黑洞给屏蔽了外部请求,是否可以在slb 并屏蔽后 能够自动将请求分发到另外的slb?由于攻击导致屏蔽外部请求的话,slb没有自动切换的方法的。6)目前slb是否可以设置黑名单?暂不支持。7)我的slb实例控制台显示是停止,为什么?需要给监听的端口设置带宽才能正常。  8)我使用了 SLB那么ESC 需要购买带宽吗?不需要的。但如需要管理ECS,则可购买少些的带宽如1M来管理。9)slb变更计费方式需要多久才能生效?变更和计费将在第二日零点后生效。10)私网SLB的使用,是如何收费的呢?私网slb是不收取费用的。 ------------------------- 12月第4周1)最近用slb后打开网页老出现503 和504错误?一般都是从ECS获取站点信息等异常导致的。您首先先确保源站都可以正常的访问。2)slb检查时突然发现SLB监听错误,怎么回事?配置的健康检查的域名为空,检查的路径是/index.html,目前查看服务器中只有站点c绑定了空主机头,且站点目录下有index.html,而此站点是停止状态,现已帮您启用,查看服务器的健康检查状态已经正常。3)我想使用slb搭建一个负载均衡,后端使用windows服务器,想咨询一下后端服务器是否需要进行什么特别配置呢?另外使用了slb后,后端还能否得到用户的真实IP地址呢,要不要进行什么特殊配置才可以得到后端用户的真实IP。后端服务器的操作系统和web环境最好保持一致,硬件配置上没有什么特别的,4层tcp是可以直接获得前端用户访问的真实地址的,7层http需要在后端web服务端设置一下,参考http://help.aliyun.com/view/13502961.html?spm=5176.7114037.1996646101.1.oRpnOM&pos=14)slb支持https吗?slb您可以通过TCP协议配置443端口的方式来实现,但是安全证书需要保存在您的后端ECS上。5)健康检查后续是否提供多个域名?健康检查只支持一个域名。6)我想关闭负载均衡的健康检查,请问如何配置?4层tcp是无法关闭健康检查的,7层http可以在控制台关闭。健康检查是不会消耗您服务器的资源的,因为slb都是通过内网ip来进行健康检查。7)如何在BLS上 限制单个IP 禁止访问 我的网站呢?SLB暂时不支持设置屏蔽用户端IP。 ------------------------- Re:Re负载均衡SLB常见咨询问题(持续连载) 引用第2楼517449116于2014-12-17 15:54发表的 Re负载均衡SLB常见咨询问题(持续连载) : 如果开启健康检查,健康检查异常的话,是不是就不会给这个异常的ECS分发? [url=http://bbs.aliyun.com/job.php?action=topost&tid=188736&pid=596806][/url] 异常的话不会在分发。 ------------------------- 2015年1月第1周1)有2台ECS起名叫A和B做SLB,A权重设的100 B权重设的0.请问.当A死机时,SLB是否会转到权重是0的B上?如果有一台设置为0,永远都不会有请求转发到此服务器上,即使权重100的宕机也不会转发到0权重的。2)会话保持的选择?开启会话保持功能后,SLB会把来自同一客户端的访问请求分发到同一台后端ECS上进行处理。针对7层(HTTP协议)服务,SLB系统是基于cookie的会话保持。针对4层(TCP协议)服务,SLB系统是基于IP地址的会话保持。3)用nagios或zabbix监控网络带宽,是否可以监控 slb的流量?nagios或zabbix,cacti是要要被监控端安装snmp或者相关agent ,slb不支持安装这些,所以无法通过这条监控软件进行监控。您可以在slb的控制台里面进行查看流量等相关信息。4)用了负载均衡后升级带宽,是不是只用在负载上面升级就可以了,ECS是不是不用在升级了?SLB与后端服务器是经过内网通信,所以如果业务量增加,您对SLB的带宽调整就行,不需要对服务器ECS进行带宽的升级。 ------------------------- 2015年1月第2周 1)SLB到期之后,会对SLB有关联的云主机怎么处理?云主机还没到期的前提下  我想把网站域名解析到SLB上 如果SLB到期了 会影响到我的网站服务么? 云服务器是不会有什么影响的,会自动又变成单独的云服务器可以供您使用的。但是如果您的域名是解析到SLB上,那么会影响到您的站点访问的。服务器上不会有其他的问题感谢您的支持。 2)当SLB 状态为停止的时候 还计算费用吗?停止后公网slb会收取实例费用。SLB价格总览参考:http://help.aliyun.com/view/11108234_13502923.html?spm=0.0.0.0.kBLsVA 3)做了SLB负载均衡,四层和7层负载均衡是否都走slb带宽? 都走slb带宽。 4)我想 移除 slb下的ecs(用作其他用途),请问在移除的时候是否会影响被负载到这台 ecs上的服务的使用 ,也是说slb这是是怎么处理的? 您可以将要移除的主机的权重更改为0 ,这样默认就不会在分发到权重为0的主机上,这个时候您可以移除该主机。但要确保您的另外一台服务器可以承受所有的访问。 5)SLB实例如何释放? 您需要登录管理控制台点击负载均衡。查询您之前创建的实例在哪个节点下,然后释放您的实例。 6)SLB按照小时的带宽计费, 是否需要每小时调整?比如我可否按照一个比较高的上限, 比如3G,然后每个小时按照该小时的峰值进行独立计费呢?   在一个自然日内,限制用户变更计费方式的次数为1次,变更计费方式将在第二日零点后生效;比如用户在今天5月5日的10:00提交了变更计费方式,那么该变配申请将在明天5月6日00:00后生效。http://help.aliyun.com/view/13502923.html?spm=5176.7114037.1996646101.3.67L5dm&pos=2;SLB目前最大带宽是1000Mbps 7)SLB可以限制每个ip的访问频率吗?(工单1F684MN)slb不支持这样配置的。 8)为什么我设置SLB健康检查间隔为5S,但却每秒都有很多请求?因为用于健康检查的服务ip不止一个,每秒中都会有不同的内网ip进行健康检查,健康检查是通过内网方式,不会消耗您后端服务器的资源,您可以将健康检查间隔阈值跳大些,这样监测频率会降低很多。 ------------------------- Re:负载均衡SLB常见咨询问题(持续连载至2015年1月第3周) 2015年1月第3周 1.发现很多100.97.0.0/16 的ip段扫描,给我服务器带来很大压力,怎么办? 100.97.0.0/16 是我们slb的健康检查服务ip段,如果给服务器带来较大压力,请调整健康检查的设置;健康检查的话 1)调低检查频率 2)设置检查静态文件,而不是默认首页或者动态文件 3)设置一个不记录日志的virtualhost,专门用于健康检查。 2)SLB里的带宽 和后面对应服务器的带宽有什么关联关系?比如SLB我设置了带宽为10M, 但是我后 面2台服务器购买的带宽都只有2M, 这种情况带宽以哪个为准? 如果您设置的是常规7层slb负载均衡,那么网站访问所使用的带宽,都将通过slb而不需要消耗云服 务器的带宽,但是云服务器本身的系统更新,以及您更新网站等等也是需要带宽的,因此您保留2M 即可。 3)采用流量计费方式的话带宽是否没有限制? SLB按流量计费最大的带宽是1G。 4)请问我如何获得一个外网SLB期所对应的内网IP呢?比如现在我有一个外网SLB下挂了一个ECS, 而ECS的iptables里我想做一些配置,针对来自于这个SLB的请求做一个判断,我需要知道这个外网 SLB的内网IP。 目前SLB与后端通过如下地址段进行交互: 10.158.0.0/16 10.159.0.0/16 100.97.0.0/16 您可以针对上述地址段做相关配置。 5)如何确保SLB后端的多台ECS之间的数据同步呢? 目前,有很多类似的工具可以实现服务器之间的数据同步,比如:rsync。具体使用及选择,还请通 过其他途径获得更多的介绍资料及指导信息。您也可以将您的ECS配置成无状态的应用服务器,而数 据和文件统一存放在RDS和OSS服务上。 ------------------------- 2015年1月第4周1.为什么我的SLB实例突然消失了?请检查您的SLB服务是否设置了自动释放时间导致。2.我想关掉负载均衡,怎么操作?您直接登录到阿里云管理控制台——slb负载均衡——实例中查询创建的slb服务,后方有“释放”的按钮,您直接释放即可。3. 我现在有两个阿里账号里面都有ECS,我能不能在一个slb里面配置不同阿里云账户下的ECS?目前只能将同一账户下的服务器添加到SLB中,无法跨账户添加。4.ECS做负载均衡需要用户做额外的配置吗?可以参考http://help.aliyun.com/knowledge_detail.htm?knowledgeId=5973987。5. 云服务器上做数据库负载均衡如何实现,需要购买什么产品 ?文件服务器能否做负载均衡,比如10台文件服务器,包括读写这种的  ?1)数据库集群,用slb理论上是可以做的,但是如果您需要集群级别的数据库,建议使用我们的RDS。2)文件服务器也可以负载均衡,使用slb在均衡,保持会话,但是有一个问题是后端文件同步的,需要您自行同步,如 rsync。6.看SLB的说明是支持ddos的防护的,请问下,SLB的防护的峰值是多少,超过峰值黑洞时间是多少?这个与slb所在地区有关,和ecs的防御阀值是一样的,黑洞时间也是2.5小时。7. slb第七层是基于haproxy还是nginx还是tengine实现的?使用tengine实现的。8.7层和4层 SLB的超时时间是多少?7层超时时间是60s,4层超时时间是900s。9.负载均衡健康检查请求数量太多,怎么回事?因为slb前端机器是一组机器,所以健康检查请求较多,请您不要担心,集群内的每台服务都会对您的健康按照您设定的频率去做健康检查:您可以按照上述方法去优化您的健康检查项,看似请求量很大,但是对您资源消耗很少的,有2个建议给您:1)扩大健康检查的频率2)将检查页面配置为静态页面。这样请求消耗的资源会节省。10. SLB配置中的最小连接数是基于什么样判断?SLB会自动判断 当前ECS 的established 来判断是否转发。 ------------------------- 2015年2月第1周1)我想了解下SLB按流量计费是不是每小时需要扣0.02元?按量付费,国内节点配置费用是按照0.02/小时。流量单独计费。按带宽计费:采取按小时计费,以日结算(运行未满一日,按照当日实际使用小时数*当日开通的最高带宽的天价格/24)。如果您使用SLB实例的时间不足一小时,按一小时收费。2)请问健康检查发的什么请求? head 还是 get?head请求。3)SLB最大连接数如何来设置?目前暂不支持设置最大连接数限制。4)SLB 后端有两个服务器HA1和HA2,为什么我将HA1的权重设置成0,SLB的健康检查就有告警呢?slb四层的话,只要权重设置为0,那么健康检查就是显示异常。 ------------------------- 2015年2月第3周1)负载均衡SLB的实例防攻击防御是多少?我们有云盾的防御黑洞策略,比如以杭州节点的slb,其最高防御的流量阈值为5G,当最大流量超过5G,您的slb vip则会被加入到黑洞中,触发黑洞会使ecs或者slb正常使用中断2.5小时,这个您可以通过云盾管理控制台查看到这个说明。2) 我其他机房的服务器能添加到你们的负载均衡SLB中吗?不可以的,slb使用的是内网和后端的ECS互联,无法直接添加非阿里云主机的服务器,且slb后端的ecs需要使用同一节点的主机。3)负载均衡服务支持的最大负载均衡实例数目多少?总体峰值可支持每秒新建链接数大约多少?SLB对于后端服务器的数目是没有限制的。对于总体峰值每秒新建连接数是没有限制的。但是因为SLB前端是云盾服务,所以最大值取决于云盾中您配置的请求数。您可以查看云盾看到具体的值。4)SLB按量计费为什么需要设置带宽峰值?如果不设置带宽峰值,遇到攻击等情况,可能流量打的非常高的,带宽流量峰值您可以在slb控制台设置。5)在SLB控制面板看到的流入流量,要比后端服务器的eth0的income流量小很多, 请问slb的流入流量是否应该等于后端服务器的内网网卡入流量吗?不等于的,后端的eth0包括了slb的流量,还有其他的流量,包括ecs直接的内网通信等。slb只做转发,不处理请求的,slb通过内网转发到ecs。6)SLB中的月账单 是指我们拥有所有的 SLB 实例的计费呢,还是单独的某个 SLB 的计费?月账单是指您不同类型产品,截止当前日期内月内消费计费额度的,是所有SLB产品的。您也可以通过账单明细进行查询具体信息的。 ------------------------- 2014年2月第4周1)10.159.63.55,这个内网ip,总是恶意访问我们网站?SLB系统除了会通过系统服务器的内网IP将来自外部的访问请求转到后端ECS上之外,还会对ECS进行健康检查(前提是您已经开启了这一功能)和对您的SLB服务进行可用性监控,这些访问的来源都是由SLB系统发起的,具体包含的IP地址段是:杭州、青岛、北京、深圳节点SLB系统IP地址段:10.159.0.0/16,10.158.0.0/16和100.97.0.0/16,为了确保您对外服务的可用性,请确保对上述地址的访问配置放行规则。2)slb计费方式变更需要多久,业务会受到影响么?变更计费方式与变更配置说明1、支持用户在按使用流量和按公网带宽2种计费方式间切换;2、支持按固定带宽方式计费的用户灵活变更带宽配置;3、在一个自然日内,限制用户变更计费方式的次数为1次,变更计费方式将在第二日零点后生效;比如:用户在今天5月5日的10:00提交了变更计费方式,那么该变配申请将在明天5月6日00:00后生效。4、按固定带宽方式计费变更带宽配置即时生效,带宽计费取自然日内用户开通的最高带宽。5、对客户业务不会造成影响;3)负载均衡能将我的外部非阿里云服务器和ECS服务器放到一块?目前负载均衡SLB仅支持阿里云ECS,无法支持外部非阿里云服务器。4)slb是否有连接数限制,需要大量终端一直与平台保持长连接,阿里云能提多少长连接?SLB没有并发连接数限制的,slb是转发请求不做处理,实际连接数还要跟您后端的处理能力有关。 ------------------------- 2015年3月第1周1)调整权重会对SLB已经有的正常连接有影响吗?目前调整权重会对调整权重的这台主机已有的连接产生影响,会有连接卡主,卡住时间由健康检查配置的时间决定。2)slb是否支持UDP协议?目前SLB暂不支持UDP协议。3)现在TCP四层负载均衡的出口带宽受ECS机器的出口带宽限制吗?slb和ECS之间走的是内网流量,带宽是不受限制的。4)如果没有外网ip, 是否可以用slb的4层转发 ?没有带宽4层SLB也是可以使用的。 ------------------------- Re:负载均衡SLB常见咨询问题(持续连载至2015年3月第1周) 2015年3月第2周 1)SLB变更计费方式并支付成功后无法添加配置? SLB在一个自然日内,限制用户变更计费方式的次数为1次,变更计费方式将在第二日零点后生效查看您今天变更过一 次计费方式,开始时间:2015-03-09 00:00:00。原按使用流量计费,在2015-03-09 00:00:00后变更为按固定带宽计 费,带宽峰值: 2Mbps。同时在您新的计费方式生效之前,您是无法对该SLB进行修改配置的。 2)我的账户怎么欠费¥7.88,这是怎么回事? 查看您有使用负载均衡slb业务,在slb产品的账单欠费,请您登陆用户中心-消费记录-账单明细中查看 记录。 3)如何屏蔽健康检查探测的日志记录? 关闭或者屏蔽对test.php访问日志的方式: 在站点配置文件中添加内容: location ~ /test.php { access_log off; fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; include fastcgi.conf; } 注: 1、对test.php的location必须要放置在对php|php5处理前,否则会因为先被进行全局匹配导致无法生效。 2、还可以用另一种方案实现: a、在后端服务器中单独为用于健康检查的页面建立一个站点; b、关闭这个站点的日志记录: location ~ .*\.(php|php5)?$ { access_log off; fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; include fastcgi.conf; } 3、如果检查页面是其他格式,比如test.html,可以采用如下方式进行屏蔽: location ~ /test.html { access_log off; } 4.我想问下SLB的固定带宽,10M是不是上行和下行最大都能达到10M? 固定带宽指的是下行带宽最大达到10M,上行带宽没有限制。上行带宽指的是SLB的入流量(上行),就是进入SLB的 流量。带宽指的是SLB的出流量(下行),就是SLB对外发生给客户端的流量。 5.一般配置SLB的时候有个权重0到100,是如何选择数值的? 权重需要您根据后端机器的配置进行选择比如AB两台机器性能一致就分别设置50,这样请求就会在这两台机器上轮询 ,不同权重决定请求分发的分配。 ------------------------- 2015年3月第3周1)公网的SLB和ECS之间的流量是否收费?不收费。2) 想做SLB+两台ECS,附件OSS,程序Discuz。但是不知道如何实现?slb要求后端的两台ecs数据是一致的,为了保持数据的一致性,建议共享存数和数据,静态文件放置到oss里,数据库文件走自己搭建的主从或者,连接同一台rds。3)按流量计算是否需要设置峰值?按流量计费不需要设置峰值的。4)如何建一个子帐号来管理负载均衡SLB?子账户无法管理负载均衡服务。
qilu 2019-12-02 01:15:34 0 浏览量 回答数 0

问题

MaxCompute百问集锦(持续更新20171011)

大数据计算服务(MaxCompute,原名 ODPS)是一种快速、完全托管的 GB/TB/PB 级数据仓库解决方案。MaxCompute 向用户提供了完善的数据导入方案以及多种经典的分布式计算模型,能够更快速的解决用户海量数据计算问题,有效...
隐林 2019-12-01 20:19:23 38430 浏览量 回答数 18

问题

MaxCompute百问集锦

大数据计算服务(MaxCompute,原名 ODPS)是一种快速、完全托管的 GB/TB/PB 级数据仓库解决方案。MaxCompute 向用户提供了完善的数据导入方案以及多种经典的分布式计算模型,能够更快速的解决用户海量数据计算问题,有效...
yq传送门 2019-12-01 20:16:47 2404 浏览量 回答数 1

问题

关于多线程编程您不知道的 5 件事:报错

虽然很少有 Java™ 开发人员能够忽视多线程编程和支持它的 Java 平台库,更少有人有时间深入研究线程。相反地,我们临时学习线程,在需要时向我们的工具箱添加新的技巧和技术。以这种方式构建和运行适...
kun坤 2020-06-07 21:21:26 0 浏览量 回答数 1

回答

详细解答可以参考官方帮助文档 如果普通远程连接软件(比如 PuTTY、Xshell、SecureCRT 等)无法使用时,您可以使用云服务器 ECS 管理控制台的 管理终端 连接 ECS 实例,查看云服务器操作界面当时的状态。如果您拥有操作权限,可以连接到服务器进行操作配置。本文将介绍如何使用云服务器 ECS 管理控制台的 管理终端 连接 ECS 实例,并说明如何 修改远程连接密码、复制长命令,以及使用管理终端的一些常见问题及处理方法。 使用场景 管理终端 适用的场景包括但不限于: 如果您的实例引导速度慢(如启动自检),您可以通过 管理终端 查看进度。 如果您的实例内部设置错误(比如,误操作开启了防火墙),导致无法使用软件远程连接,您可以通过 管理终端 连接到实例后修改设置(比如关闭防火墙)。 如果应用消耗 CPU 或带宽比较高(例如云服务器被肉鸡,进程 CPU或带宽跑满),导致无法远程连接,您可以通过 管理终端 连接到 ECS 实例,结束异常进程等。 前提条件 您已经创建了实例。 您已经设置了实例登录密码。如果未设置,您可以 重置实例密码。 操作步骤 登录 云服务器 ECS 管理控制台。 在左侧导航栏里,单击 实例。 在 实例列表 页上,选择目标地域。 在实例列表里,找到需要连接的实例,在 操作 列,单击 远程连接。 连接 管理终端: 使用主账号第一次连接 管理终端 时,按以下步骤连接管理终端: 在弹出的 远程连接密码 对话框,复制密码。 说明 连接密码仅在第一次连接管理终端时显示一次。如果您以后需要使用这个密码连接管理终端,请记下该密码。 如果您以RAM用户身份第一次连接 管理终端,不会出现这个对话框。 单击 关闭。 在弹出的 输入远程连接密码 对话框中粘贴密码后,单击 确定,开始连接 管理终端。 如果您忘记了密码或者以RAM用户身份第一次连接 管理终端 时,按以下步骤操作: 修改远程连接密码。 单击界面左上角的 发送远程命令 > 连接远程连接。 在弹出的 输入远程连接密码 对话框中,输入刚修改的新密码。 单击 确定 ,开始连接 管理终端。 使用主账号或RAM用户身份再次连接 管理终端 时,在弹出的 输入远程连接密码 对话框中输入密码,单击 确定,开始连接 管理终端。 登录 ECS 实例。根据实例的操作系统,您应执行不同的操作步骤: 如果是 Linux 实例,输入用户名 root 和实例登录密码。 说明 Linux 系统一般不会显示密码输入过程。 您可以单击界面左上角的 发送远程命令 > CTRL+ALT+Fx(x 为 1 − 10),切换不同的 管理终端 连接 Linux 实例执行不同的操作。 如果出现黑屏,可能是因为 Linux 实例处于休眠状态,单击键盘上任意键即可唤醒。 如果是 Windows 实例,在 管理终端 界面的左上角单击 发送远程命令 > CTRL+ALT+DELETE,进入 Windows 实例的登录界面。输入用户名和密码即可登录。 其他操作 修改远程连接密码 如果您希望使用方便记忆的远程连接密码,或者忘记了密码,您可以按照以下步骤修改远程连接密码。 说明 如果您要连接的不是 I/O 优化实例,修改密码后,您需要在 ECS管理控制台 重启实例使新密码生效。重启操作需要停止您的实例,中断您的业务,所以请谨慎执行。 进入 管理终端 界面。 关闭弹出的 远程连接密码 对话框或 输入远程连接密码 对话框。 在界面的右上角,单击 修改远程连接密码。 在弹出的 修改远程连接密码 对话框里,输入新密码后,单击 确定,关闭对话框。 新密码生效: 如果您要连接的是 I/O 优化实例,新密码会立即生效。 如果您要连接的是非 I/O 优化实例,您必须先在控制台上 重启实例,密码才会生效。在 ECS 实例内部重启无效。 复制长命令 如果连接的是 Linux 实例,您可以使用 复制命令输入 功能输入比较长的文本、文件下载地址等。 进入 管理终端 界面。 在界面右上角,单击 复制命令输入 。 在弹出的 复制粘贴命令 对话框中,输入具体的命令后,单击 确定,即可将命令复制到 Linux 的命令行界面。 管理终端 FAQ 管理终端是独享的吗? 目前是独享的。如果一个用户已经登录,其他用户则无法再登录。 忘记了远程连接密码,怎么办? 如果忘记远程连接密码,您可以 修改远程连接密码。 为什么修改了远程连接密码还是连不上管理终端? 如果您要连接的不是 I/O 优化实例,您需要在管理控制台上 重启实例,新密码才会生效。在 ECS 实例内部重启无效。 管理终端提示 授权验证失败,怎么解决? 输入远程连接密码后,提示 授权验证失败,可能是因为您输入了错误的远程连接密码,所以,您应该: 确认您输入了正确的远程连接密码。 如果您忘了密码,可以 修改远程连接密码 之后再重试。 如果要连接非 I/O 优化实例,修改密码后,您需要先在控制台上 重启实例 使新的远程连接密码生效。 连接到管理终端后出现黑屏,怎么办? 连接到管理终端后出现黑屏,说明系统处于休眠状态。根据操作系统不同,您应执行不同的操作: 如果是 Linux 实例,您可以按任意键激活该实例,进入登录界面。 如果是 Windows 实例出现持续黑,您可以在界面左上角单击 发送远程命令 > CTRL+ALT+DELETE ,进入登录界面。 管理终端无法访问了,怎么办? 您可以使用 Chrome 浏览器进入管理终端界面,在键盘上按 F12 键显示开发者工具,然后分析 Console 中显示的信息。 我使用 IE8.0,为什么无法使用管理终端? 管理终端目前仅支持 IE10 及以上的 IE 浏览器。您可以下载最新的 IE 浏览器或 Chrome 浏览器。 建议使用 Chrome 浏览器。阿里云的控制台对 Chrome 浏览器的兼容性更好。 我用 Firefox 浏览器打开管理终端会报错 安全连接失败,怎么办? 报错原因:可能您使用的 Firefox 版本没有共用的加密算法。 建议使用 Chrome 浏览器。阿里云的控制台对 Chrome 浏览器的兼容性更好。 相关文档 在PC端,您可以使用其他方式远程连接ECS实例: 如果是Linux实例: 使用SSH密钥对连接Linux实例 使用用户名密码验证连接 Linux 实例 如果是Windows实例:使用软件连接Windows实例 在移动设备端,您可以参考 在移动设备上连接实例
2019-12-01 22:56:54 0 浏览量 回答数 0

云产品推荐

上海奇点人才服务相关的云产品 小程序定制 上海微企信息技术相关的云产品 国内短信套餐包 ECS云服务器安全配置相关的云产品 开发者问答 阿里云建站 自然场景识别相关的云产品 万网 小程序开发制作 视频内容分析 视频集锦 代理记账服务 阿里云AIoT