这篇记录的是Android中如何把我们往存储中写入的文件,如何显示到文件管理的下载列表、最近文件列表中。 假设保存的文件为外部存储中的File file,也许是app私有目录中的(未测试)、也许是外部存储根目录中download、pictures等目录中的(没发现问题)。 第一步,暴力扔给媒体扫描,管你是不是图片 如果我们的文件是图片、视频、音乐等媒体文件,显示到相册等地方 context.sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE , Uri.fromFile(file))); 第二步,添加到下载列表,自动会显示到最近文件 String mime=MimeTypeMap.getSingleton().getMimeTypeFromExtension :DownloadManager.addCompletedDownload,调用后会把文件添加到下载列表,并出现在最近文件列表中(图片是会,其他类型测试的可能会)。
每个IDC都有一整套接口机/逻辑设备/存储设备用以支撑用户的上传下载、及文件落地存储的需求。 OC点的主要作用是提供外网访问,承载用户的下载流量。 以front层的单机剔除为例: ? 如果整个OC或IDC点碰到故障,由于变动较大,一般依赖运维人员手工切换来恢复,或者通过模块之间的重试机制来保障。 朋友圈下载的重试: ? 实现的原理是每一层master都会返回给前端至少两组ip列表,并保证两组ip列表为异地节点,前端失败时才可以实现异地重试。 由于上传preupload接口机及后层的逻辑模块等,都无法支持10倍涨幅。所以在架构中另外搭建了两套TSSD缓冲池,缓冲池用于临时存储新上传的文件,可以支持读写。 用户下载时,会根据文件标识进行判断,如果发现文件存储在缓冲池二而不是TFS中,则会到缓冲池二中去获取文件。所以缓冲池二可以替代TFS的功能,起到保护底层模块的效果。
安全/快速/稳定的APP消息推送服务,用户促活/留存利器,稳定服务于腾讯游戏、腾讯视频等高日活应,欲购从速!
每个IDC都有一整套接口机/逻辑设备/存储设备用以支撑用户的上传下载、及文件落地存储的需求。 OC点的主要作用是提供外网访问,承载用户的下载流量。 每个OC内的设备,一起组成一个缓存池,用户下载时,本地OC中缓存不命中,才到IDC去回源拉取文件。 容灾及重试机制: 朋友圈的模块容灾主要是实现单机故障时的自动剔除,主要形式是通过master管理服务器的ip列表,通过心跳探测等方式找到异常设备,并屏蔽故障ip,不返回给前端使用,以front层的单机剔除为例 实现的原理是每一层master都会返回给前端至少两组ip列表,并保证两组ip列表为异地节点,前端失败时才可以实现异地重试。 用户下载时,会根据文件标识进行判断,如果发现文件存储在缓冲池二而不是TFS中,则会到缓冲池二中去获取文件。所以缓冲池二可以替代TFS的功能,起到保护底层模块的效果。
2 TB/86400秒~=25 MB/s 由于每个传入的消息都需要发送给另一个用户,因此上传和下载都需要相同的25MB/s带宽。 如果是临时断开连接,例如,接收器的长轮询请求刚刚超时,那么我们应该期待用户重新连接。在这种情况下,我们可以要求发件人重试发送邮件。此重试可以嵌入到客户端的逻辑中,这样用户就不必重新键入消息。 HBase是一个面向列的键值NoSQL数据库,可以针对一个键将多个值存储到多个列中。HBase以Google的BigTable为模型,运行在Hadoop分布式文件系统(HDFS)之上。 所有活动用户都将保持与服务器的连接打开以接收消息。每当新消息到达时,聊天服务器就会在长轮询请求中将其推送到接收用户。消息可以存储在HBase中,它支持快速的小更新,并且范围广泛 基于搜索。 推送通知将使我们的系统能够向脱机用户发送消息。 对于推送通知,每当出现新消息或事件时,每个用户都可以从其设备(或web浏览器)选择加入以获取通知。
3.3、会话消息列表绘制 基于不同的场景,如社交为主的私信、用户服务为主的咨询反馈等,都需要会话列表的展示形式;但各场景又不完全相同,需要分析当前会话列表的共通性及可封装复用的部分,以更好地支撑后续业务的扩展 而如通用消息如头像、名称、消息时间、是否可举报、已读未读状态、发送失败/重试状态等都可以统一处理,降低修改维护的成本,同时使各消息 UI 处理逻辑更少、更清晰,更利于新类型的扩展管理。 4.1、消息去重 在前面的架构中,我们使用 msg_id 来标记消息列表中的每一条消息,msg_id 是根据客户端上传的数据,进行存储后生成的。 ? 但从会话页或者列表页退出之后,就无法单纯地从界面上获取这些信息,这时需要有其他的机制,让用户获知当前消息的状态。 系统推送与第三方推送是一个可行的选择,但本质上推送也是基于长链接提供的服务。 在重试机制 1.0 版本中,对于可能出现较多重试请求的情况,采取的是添加 60s 内连续 5 次报错延迟重试的限制。 具体流程如下: ?
1、"调度中心OnLine:"右侧显示在线的"调度中心"列表, 任务执行结束后, 将会以failover的模式进行回调调度中心通知执行结果, 避免回调的单点风险; 2、"执行器列表" 中显示在线的执行器列表 AppName: 每个执行器机器集群的唯一标示, 任务注册以 "执行器" 为最小粒度进行注册; 每个任务通过其绑定的执行器可感知对应的执行器机器列表; 注册表: 见"XXL_JOB_QRTZ_TRIGGER_REGISTRY 以Shell模式任务为例,获取分片参数代码如下 echo "分片序号 index = $2" echo "分片总数 total = $3" 分片参数属性说明: index:当前分片序号(从0开始),执行器集群列表中当前执行器的序号 09-29] 1、推送新版本 V1.4.2 至中央仓库, 大版本 V1.4 进入维护阶段; 2、任务新增时,任务列表偏移问题修复; 3、修复一处因bootstrap不支持模态框重叠而导致的样式错乱的问题 、jackson等等; 6.22 版本 V1.9.2 特性[迭代中] 1、[迭代中]支持通过API服务操作任务信息; 2、[迭代中]任务告警逻辑调整:任务调度,以及任务回调失败时,均推送监控队列。
文件获取模块:下载或者读取各渠道对账文件 文件解析模块:创建不同的解析模板,根据渠道和文件类型获取对应的解析模板进行解析 对账处理模块:对账的业务逻辑处理 差错处理模块:处理差错池中的订单 一般会设计一个定时任务 (image-8811f3-1528850749952)] 1、下载对账单 大多数银行都要求接入方提供ftp服务,银行定时将对账单推送到接入方提供的ftp服务器上面;还有一部分银行会提供对账单的下载服务 技术实现上可以做成工厂模式,不同的支付渠道有不同的下载类,如果是http接口将文件写入到对账单,如果是ftp服务器,将服务器中的对账单下载到本地带解析的目录中。 开始以银行通道的数据为准对账 以平台订单为基准对账逻辑:以平台所有交易成功的订单为基准,遍历银行订单的所有数据,找出订单号相同的订单,对比订单的金额、手续费是否一致。 以银行订单为基准对账逻辑:以银行的交易数据为基准,遍历所有平台的交易(包括未成功的订单),找出订单号相同但支付状态不一致的订单,在进行对比金额存入差错池。
1、"调度中心OnLine:"右侧显示在线的"调度中心"列表, 任务执行结束后, 将会以failover的模式进行回调调度中心通知执行结果, 避免回调的单点风险; 2、"执行器列表" 中显示在线的执行器列表 AppName: 每个执行器机器集群的唯一标示, 任务注册以 "执行器" 为最小粒度进行注册; 每个任务通过其绑定的执行器可感知对应的执行器机器列表; 注册表: 见"XXL_JOB_QRTZ_TRIGGER_REGISTRY 以Shell模式任务为例,获取分片参数代码如下 echo "分片序号 index = $2" echo "分片总数 total = $3" 分片参数属性说明: index:当前分片序号(从0开始),执行器集群列表中当前执行器的序号 09-29] 1、推送新版本 V1.4.2 至中央仓库, 大版本 V1.4 进入维护阶段; 2、任务新增时,任务列表偏移问题修复; 3、修复一处因bootstrap不支持模态框重叠而导致的样式错乱的问题 10、任务告警逻辑调整:任务调度,以及任务回调失败时,均推送监控队列。
系统因素:各个电脑的系统文件与设置都不尽相同,这方面的问题不可统一解决。 错误代码 101、102 说明:无法安装产品 官方解决方案:单击“重试”以再次下载并安装它。 建议:如果大家出现这个情况使用的不是本站安装包,请重新下载安装包并进行安装。 107 说明:下载的内容已损坏 官方解决方案:单击“重试”以再次下载并安装它。 116 说明:处理文件系统中的文件时出错 官方解决方案:重新启动系统,然后重新尝试安装。 建议:如果出现这种情况不是本站推送中的安装包,请重新下载安装包进行安装。 126 说明:下载的内容已损坏 官方解决方案:单击“重试”以再次下载并安装它。 建议:选择一个干净不缺失文件的安装包很重要。 建议:参照126 145 说明:文件存在于安装路径中 官方解决方案:请重命名/删除文件,然后重试。要获取有关此文件的信息,请参阅更多信息。
namespace (命名空间):一个应用下不同配置的分组,可以简单地把namespace类比为文件,不同类型的配置存放在不同的文件中,如数据库配置文件,RPC配置文件,应用自身的配置文件等;应用可以直接读取到公共组件的配置 ),而后直接通过IP+Port 访问服务,同时在 Client 侧会做 load balance、错误重试 Portal 通过域名访问 Meta Server 获取Admin Service服务列表(IP 三个逻辑角色部署在同一个JVM进程中 ConfigService、AdminService、Portal 属于 Apollo 服务端的模块,其中提到的 Eureka 是为了保证高可用,Config 和 获取到服务实例地址列表之后,再以简单的客户端软负载(Client SLB)策略路由定位到目标实例,并发起调用。 客户端实现 在配置中心中,一个重要的功能就是配置发布后实时推送到客户端。 客户端从Apollo配置中心服务端获取到应用的最新配置后,会保存在内存中 客户端会把从服务端获取到的配置在本地文件系统缓存一份,在遇到服务不可用,或网络不通的时候,依然能从本地恢复配置。
固件下载: 一般 Kindle 在连接 WiFi 的状态下,收到亚马逊的升级推送后会自动> 升级到最新版本固件,无需手动干预,但时间不确定,少则两三天,多则几个月。 将新的更新文件从电脑拖入Kindle驱动器“根目录”下(和 documents 文件夹同级) (重要: 不要将更新文件拖入Kindle驱动器中的任何文件夹中。) ,以从其接受文档 您只能通过已添加至【管理我的内容和设备】中的【已认可的发件人电子邮箱列表】的电子邮箱来接收文档。 如果您的电子邮箱不在列表中,请选择【添加认可的电子邮箱】。 输入所需的电子邮箱,然后点击【添加地址】。 提示: 要删除某个认可的电子邮箱,请选择您要删除的电子邮箱旁边的【删除】,然后点击【确定】以确认删除。 重要:建议您在发送文件之前将文件名改成英文(包括ZIP压缩文件和文件夹中的文件名)。
5、App根据离线包列表下载离线包 获取到离线包列表之后,在后台线程中按顺序逐个下载。 6、离线包安装 下载完成,解压,合并,安装; 其中2个系统的功能简单介绍下。 为了减少网络因素导致的失败,需要增加重试策略,比如最多下载3次,第一次失败,隔15s重试一次,第二次2次失败,隔30s再试一次,3次失败则会终止继续下载。 2、签名校验 文件下载完成之后,需要检查文件是否被篡改过,因为离线包里面都是代码,必须保证代码的正确性,建议在下发离线包列表的时候,下发该文件的签名,下载完成之后,校验签名是否正确。 3、定时轮循 最初我们的离线包列表是在App启动之后,会获取一次,然后下载,当时经常会有反馈离线包下载不及时,不重启就下载不到最新版本。为了解决这个问题,也考虑过使用服务器推送的方案,但是成本较高。 以业务A为例,简单说明离线包的下载安装过程: 1、业务A的离线包下载成功之后开启子线程合并下发的离线包Anew.7z和App包中的原始包Abase.7z,合并成功之后保存在离线包的工作目录,例如A的工作目录为
($order))->onQueue('payment'); 此外,你还可以在任务类中通过 queue 属性指定该任务被推送到的队列: <? return (static::$popCallbacks[$this->name])($popJobCallback, $queue); } // 依次读取队列列表中每个队列中的任务进行处理 失败任务重试 基于 Webhook 推送消息到其他应用 以上演示的都是同一个应用内部的消息数据推送,此外,我们还可以借助 Webhook 实现不同应用之间的消息推送。 作为第一方应用,我们也可以对外提供这种 Webhook URL,告知第三方以应用服务接口的响应结果,我们把响应数据看作消息的话,这个时候,我们的第一方应用是消息数据的生产者,调用我们服务等待响应结果的第三方应用是处理消息数据的消费者 最后,如果所有尝试次数用尽还未执行成功,则将该任务标记为执行失败,我们可以在任务类中定义一个 failed 方法编写任务执行失败后的业务逻辑: // 任务执行失败后发送邮件通知给相关人员 public
水平扩展:应用层、容量规划 垂直扩展:按业务域做垂直拆分(避免业务扩展带来的逻辑复杂度提升) 按照业务类型或者功能做划分 应用:展示层,webview等,只做数据展示和渲染; 服务:按照业务类型和逻辑划分处理 常见的配置中心组建:Apollo、Nacos config推送:主动推送最新配置数据到client(低时延,适合数据量较小的情况) config拉取:client定时拉取最新的配置数据(复杂,管理client 成功/失败(重试机制) 增长消费状态标识(ACK,失败放单独队列,重试) 容错处理 失败/异常重试; 消息持久化存储; 分布式数据分层 解决了什么问题? ,更新可用服务的地址列表 负载均衡:随机分配&权重选取 服务发现:服务与提供服务的机器解耦 服务注册:传递类名、方法名、参数类型、版本号 统一SDK:封装统一的client/server标准接口规范(协议 (http/TCP)&失败重试机制&参数传递规范)
Apollo(阿波罗)是携程框架部门研发的开源配置管理中心,能够集中化管理应用不同环境、不同集群的配置,配置修改后能够实时推送到应用端,并且具备规范的权限、流程治理等特性。 来源:网络 各模块职责 Config Service提供配置的读取、推送等功能,服务对象是Apollo客户端 Admin Service提供配置的修改、发布等功能,服务对象是Apollo Portal 服务列表(IP+Port),而后直接通过IP+Port访问服务,同时在Client侧会做load balance、错误重试 Portal通过域名访问Meta Server获取Admin Service服务列表 三个逻辑角色部署在同一个JVM进程中 分步执行流程 Apollo启动后,Config Service和Admin Service会自动注册到Eureka服务注册中心,并定期发送保活心跳。 关键字:cluster namespace (命名空间): 一个应用下不同配置的分组,可以简单地把namespace类比为文件,不同类型的配置存放在不同的文件中,如数据库配置文件,RPC配置文件,应用自身的配置文件等
} else if(B设备){ IotPushStrategy.push(deviceVO,content); } } } 总结 将每种通道的推送逻辑封装到了具体的策略中 使用场景 不同场景的处理流程,部分逻辑是通用的,可以放到父类中作为通用实现,部分逻辑是个性化的,需要子类去个性实现。 实践经验 还是接着之前语音播报的例子来说,后期我们新加了两个需求: 消息推送需要增加 trace 有些通道推送失败需要重试 所以现在的流程变成了这样: trace 开始 通道开始推送 是否允许重试,如果允许执行重试逻辑 trace 结束 其中 1 和 4 是通用的,2 和 3 是个性化的,鉴于此我在具体的推送策略之前增加了一层父类的策略,将通用逻辑放到了父类中,修改后的代码如下: abstract class AbstractPushStrategy CallResult callResult = doPush(deviceVO, content); //3.是否允许重试逻辑由子类实现,如果允许执行重试逻辑
Nacos从2.0以后增加了对grpc的支持,代码中HTTP的代理初始化还有保留,我们注册发现通常为临时节点,这部分已由gRPC接管。可以对比下新旧逻辑的实现差异。 gRPC 客户端代理的初始化主要逻辑为创建gRPC Client并启动 并注册ServerRequestHandler用于处理Nacos Server推送的NotifySubscriberRequest :@1如果推送的为服务信息通过processServiceInfo处理,逻辑见上篇;@2 如果dump类型,则客户端发送服务信息serviceInfoMap的ack信息到服务端。 boolean serverExist = false; // 判断连接上下文的reconnectContext.serverInfo是否在我们推荐设置的列表中 reconnectContext.serverInfo.serverPort = serverInfo.serverPort; break; } } // 不再推荐的列表中则移除
腾讯移动金融开发平台(TMF)为银行、互联网金融、保险、证券客户提供一站式、覆盖全生命周期的移动金融服务。核心服务包括APP客户端开发组件、应用加固、环境安全检测等APP开发运营关键服务,帮助金融机构低成本、高效率地打造移动金融服务…...
扫码关注腾讯云开发者
领取腾讯云代金券