• [公告] 【获奖公示】12.6号直播 / DTSE Tech Talk丨NO.50:从架构设计到开发实战,深入浅出了解Sermant
    中奖结果公示感谢各位小伙伴参与本次活动,欢迎关注华为云DTSE Tech Talk 技术直播更多活动~本次活动获奖名单如下:账号名 奖项名称 奖品名称linghz666 优质提问 开发者定制长袖卫衣3XL码hw81541353 优质提问开发者定制长袖卫衣M码hw081993541 优质提问开发者定制长袖卫衣XL码hw076786082 微信抽奖大狮黄色PVC包hid_lm9fpkibkdd6hvh 微信抽奖大狮黄色PVC包xj120141121 官网抽奖开发者定制Polo衫黑色M码qingqingjiayuan6 官网抽奖开发者定制Polo衫黑色xiaozhongy 官网抽奖文件收纳袋yeats_liao 论坛提问奖书籍《微服务架构设计模式》
  • [热门活动] 【云原生专题直播有奖提问】DTSE Tech Talk 技术直播 NO.50:看直播提问题赢华为云定制长袖卫衣、《微服务架构设计模式》书籍等好礼!
    中奖结果公示感谢各位小伙伴参与本次活动,本次活动获奖名单如下:请获奖的伙伴在12月12日之前点击此处填写收货地址,如逾期未填写视为弃奖。再次感谢各位小伙伴参与本次活动,欢迎关注华为云DTSE Tech Talk 技术直播更多活动~直播简介【直播主题】从架构设计到开发实战,深入浅出了解Sermant【直播时间】2023年12月6日 16:30-18:00【直播专家】栾文飞 华为云云原生DTSE技术布道师【直播简介】云原生无代理服务网格太深奥?带你深入浅出了解Sermant,从架构设计到开发实战,步步为营。本期直播将聚焦于Sermant的架构解析及开发实战中,从开发者视角来看核心设计中的插件机制和类加载器架构,在实战中从基础能力开发,到进阶使用统一动态配置能力、统一日志能力等一步步完成插件开发。直播链接:cid:link_1活动介绍【互动方式】直播前您可以在本帖留下您疑惑的问题,专家会在直播时为您解答。直播后您可以继续在本帖留言,与专家互动交流。我们会在全部活动结束后对参与互动的用户进行评选。【活动时间】即日起—2023年12月7日【奖励说明】评奖规则:活动1:直播期间在直播间提出与直播内容相关的问题,对专家评选为优质问题的开发者进行奖励。奖品:华为云定制长袖卫衣活动2:在本帖提出与直播内容相关的问题,由专家在所有互动贴中选出最优问题贴的开发者进行奖励。奖品:书籍《微服务架构设计模式》更多直播活动直播互动有礼:官网直播间发口令“华为云 DTSE”抽华为云定制钢笔礼盒、填写问卷抽华为云定制鼠标等好礼【注意事项】1、所有参与活动的问题,如发现为复用他人内容或直播间中重复内容,则取消获奖资格。2、为保证您顺利领取活动奖品,请您在活动公示奖项后2个工作日内私信提前填写奖品收货信息,如您没有填写,视为自动放弃奖励。3、活动奖项公示时间截止2023年12月8日,如未反馈邮寄信息视为弃奖。本次活动奖品将于奖项公示后30个工作日内统一发出,请您耐心等待。4、活动期间同类子活动每个ID(同一姓名/电话/收货地址)只能获奖一次,若重复则中奖资格顺延至下一位合格开发者,仅一次顺延。5、如活动奖品出现没有库存的情况,华为云工作人员将会替换等价值的奖品,获奖者不同意此规则视为放弃奖品。6、其他事宜请参考【华为云社区常规活动规则】。
  • [综合] 构建高可扩展性的分布式系统
    标题:构建高可扩展性的分布式系统正文: 大家好!今天我想和大家分享一些关于构建高可扩展性的分布式系统的经验和技巧。随着互联网应用的不断发展,我们面临着越来越多的挑战,其中之一就是如何构建能够应对高并发和大规模用户访问的系统。分布式系统正是解决这个问题的有效方式之一。构建高可扩展性的分布式系统需要我们考虑多个方面,下面是一些关键的步骤和策略:选择适当的架构:选择合适的架构对于分布式系统的成功至关重要。常见的架构模式包括微服务架构、事件驱动架构和基于消息的架构。根据应用的需求和复杂性,选择最适合的架构模式。水平扩展:水平扩展是实现高可扩展性的关键。将系统划分为多个可独立部署和扩展的组件,通过增加服务器节点来增加系统的处理能力。使用负载均衡器来分发请求,确保每个组件都能得到平均的负载。异步通信:在分布式系统中,异步通信是提高系统性能和可伸缩性的重要手段。使用消息队列和事件总线来解耦系统的各个组件,提高系统的弹性和可靠性。优化数据存储:选择合适的数据存储方案是构建高可扩展性分布式系统的关键。使用分布式数据库或者分片数据库来分散数据负载。使用缓存技术减轻数据库的压力。监控和容错:在分布式系统中,监控和容错是至关重要的。使用监控工具和日志系统实时跟踪系统的性能和状态。实施故障转移和自动恢复机制来处理节点故障。自动化部署和扩展:利用自动化工具和脚本来简化系统的部署和扩展过程。通过自动化流程,实现快速部署新的节点和组件,提高开发和运维效率。测试和模拟:在构建高可扩展性的分布式系统时,测试和模拟是不可或缺的步骤。使用模拟工具和负载测试工具来评估系统的性能和可扩展性,发现潜在的瓶颈并进行优化。
  • [综合] 掌握有效的调试技巧和工具
    在软件开发过程中,调试是一个至关重要的技能。无论您是新手还是经验丰富的开发者,掌握有效的调试技巧和工具都是提高开发效率和代码质量的关键。在本文中,我将与大家分享一些有用的调试技巧和常用工具,希望能够对你的开发工作有所帮助。使用断点:断点是调试过程中最常用的工具之一。通过在代码中设置断点,您可以暂停程序的执行,并逐步检查变量的值、观察程序流程等。在调试器中,您可以单步执行代码、查看堆栈跟踪和监视表达式等,以更好地理解程序的执行过程。日志记录:将适当的日志语句插入到代码中,可以帮助您追踪程序的执行路径和输出有用的调试信息。通过记录关键变量的值、函数的输入和输出等,您可以更好地理解程序的行为,并找到问题所在。使用适当的日志级别,您可以在需要时调整日志的详细程度。调试输出:除了日志记录,使用调试输出语句也是一种常用的调试技巧。通过在关键位置输出变量值或调试信息,您可以实时观察程序的状态。然而,在发布版本中,请确保将这些调试输出语句删除或禁用,以免影响性能或泄露敏感信息。异常处理:合理处理异常是调试的一个重要方面。捕获异常并输出相关的调试信息,可以帮助您快速定位问题并提供有用的错误信息。在处理异常时,确保适当地记录错误日志,以便您在后续调试中进行分析。使用调试工具:现代集成开发环境(IDE)提供了强大的调试工具,可以大大简化调试过程。利用IDE的功能,如变量监视、堆栈跟踪、条件断点等,可以更快速、更准确地找到问题所在。熟悉您所使用的IDE的调试功能,并充分利用它们。远程调试:对于分布式系统或远程服务器上的问题,远程调试工具是非常有用的。它们允许您通过网络连接到远程服务器,并像调试本地应用程序一样进行调试。远程调试工具可以帮助您在不同的环境中调试代码,并解决生产环境中的问题。单元测试:编写和运行单元测试是调试的一个重要方面。通过编写全面的单元测试用例,您可以更早地发现潜在的问题,并验证代码的预期行为。单元测试可以帮助您确定问题的具体位置,并确保对代码进行了适当的修复。总结起来,调试是软件开发过程中不可或缺的一部分。通过掌握有效的调试技巧和工具,您可以更快速地定位和解决问题,提高开发效率和代码质量。请尝试上述提到的技巧和工具,并根据您的项目需求进行调整和优化。如果你有其他有用的调试技巧或工具,也欢迎在下面的评论中分享给大家。让我们一起不断学习和进步!祝编码愉快!
  • [综合] 使用设计模式提高软件可维护性
    在软件开发的世界中,我们经常面临着维护复杂代码和解决繁琐问题的挑战。为了解决这些问题并提高软件的可维护性,设计模式成为了一个非常重要的工具。在本篇文章中,我将向大家介绍如何使用设计模式来提高软件的可维护性。设计模式是一种被广泛接受的解决特定问题的方案。它们提供了经过验证的方法和技巧,可以帮助我们构建灵活、可扩展和易于维护的软件系统。以下是一些常见的设计模式,它们在软件开发中发挥着重要作用:单例模式:确保一个类只有一个实例,并提供全局访问点。这在需要共享资源或管理全局状态的情况下非常有用。工厂模式:通过工厂类创建对象,封装了对象的实例化过程。这样可以降低代码的耦合度,使得系统更加灵活。观察者模式:定义了对象之间的一对多依赖关系,当一个对象状态发生改变时,其所有依赖对象都会收到通知。这样可以实现松耦合的通信机制。策略模式:定义了一系列的算法,并将每个算法封装起来,使它们可以互相替换。这样可以在不修改原有代码的情况下动态地改变算法。适配器模式:将一个类的接口转换成客户端所期望的另一个接口。这在不兼容的接口之间进行协作时非常有用。模板方法模式:定义了一个算法的骨架,而将一些步骤的实现延迟到子类。这样可以避免代码的重复,同时又保持了算法的稳定性。以上只是一小部分常见的设计模式,每个模式都有其独特的用途和优点。通过熟练运用设计模式,我们可以改善软件系统的结构和可维护性,降低代码的复杂度,提高开发效率。当然,设计模式并不是万能的。在使用设计模式时,我们需要考虑到系统的需求和特点。过度使用设计模式可能会增加系统的复杂度,因此需要根据实际情况进行权衡和取舍。总结一下,设计模式是提高软件可维护性的重要工具。通过运用适当的设计模式,我们可以降低代码的复杂度,提高系统的灵活性和可扩展性。然而,我们应该谨慎地选择和使用设计模式,以确保其在特定情况下的合理性和有效性。请分享你对设计模式在提高软件可维护性方面的经验和想法。如果你有任何问题或建议,也欢迎在下方留言。谢谢大家的阅读!
  • [技术干货] 使用Apache IoTDB进行IoT相关开发的架构设计与功能实现(5)
    使用Apache IoTDB进行IoT相关开发的架构设计与功能实现(5)在开始使用IoTDB之前,大家需要首先配置配置文件,为了方便起见,已经有部分重要文件设置了默认配置。总的来说,Apache IoTDB为用户提供三种配置模块:环境配置文件(iotdb-env.bat, iotdb-env.sh),环境配置项的默认配置文件。用户可以在文件中配置JAVA-JVM的相关系统配置项系统配置文件(iotdb-engine.properties),iotdb-engine.properties:IoTDB引擎层配置项的默认配置文件。用户可以在文件中配置IoTDB引擎的相关参数,如JDBC服务监听端口(rpc_port),未排序数据存储目录(unsequence_data_dir),等等。此外,用户可以配置关于TsFile的信息,例如每次写入磁盘的数据大小(group_size_in_byte)日志配置文件(logback.xml)三个配置项的配置文件位于IoTDB安装目录中:$IOTDB_HOME/conf文件夹。热修改配置为了方便用户,IoTDB服务器为用户提供了热修改功能,即修改中的一些配置参数iotdb engine. Properties并立即将其应用到系统中。在下面描述的参数中,这些参数Effective是trigger支持热修改。触发方式:客户端发送命令load configurationIoTDB服务器。有关客户端的使用,请参见第4章。IoTDB环境配置文件环境配置文件主要用于配置IoTDB服务器运行时的Java环境相关参数,如JVM相关配置。当IoTDB服务器启动时,这部分配置被传递给JVM。用户可以通过查看iotdb-env.sh(或者iotdb-env.bat)文件。每个变量的细节如下:MAX_HEAP_SIZEHEAP_NEWSIZEJMX_LOCALJMX_PORTJMX_IP
  • [技术干货] 使用Apache IoTDB进行IoT相关开发的架构设计与功能实现(4)
    使用Apache IoTDB进行IoT相关开发的架构设计与功能实现(4)编码为了提高数据存储的效率,需要在数据写入时对数据进行编码,从而减少磁盘空间的使用量。在写入和读取数据的过程中,可以减少I/O操作中涉及的数据量以提高性能。对于不同类型的数据,IoTDB支持四种编码方法:PLAIN:普通编码是默认的编码模式,即不编码,支持多种数据类型。它具有较高的压缩和解压缩效率,但空间存储效率较低。TS_2DIFF:二阶差分编码更适合对单调递增或递减的序列数据进行编码,不推荐对波动较大的序列数据进行编码。RLE:游程编码更适合存储具有连续整数值的序列,不推荐用于大多数时间具有不同值的序列数据。游程编码也可用于对浮点数进行编码,但必须指定保留的十进制数字。比较适合存储浮点值连续出现、单调递增或递减的序列数据,不适合存储小数点后精度要求高或波动较大的序列数据。GORILLA:GORILLA编码更适合值相近的浮点序列,不建议用于波动较大的序列数据。常规编码常规数据编码更适合编码常规序列递增的数据(例如,每个数据点之间经过的时间相同的时间序列),在这种情况下,它比TS_2DIFF更好。规则数据编码方式不适合有波动的数据,即不规则数据,此时建议用TS_2DIFF处理。数据类型和编码之间的对应关系前面描述的四种编码适用于不同的数据类型。如果对应关系是错误的,就不能正确地创建时间序列。下表中详细总结了数据类型及其支持的编码之间的对应关系。**数据类型及其支持的编码之间的对应关系**Data TypeSupported EncodingBOOLEANPLAIN, RLEINT32PLAIN, RLE, TS_2DIFF, REGULARINT64PLAIN, RLE, TS_2DIFF, REGULARFLOATPLAIN, RLE, TS_2DIFF, GORILLADOUBLEPLAIN, RLE, TS_2DIFF, GORILLATEXTPLAIN压缩当时间序列按照指定的类型写成二进制数据编码后,IoTDB使用压缩技术对数据进行压缩,进一步提高空间存储效率。虽然编码和压缩都是为了提高存储效率,但编码技术通常只适用于特定的数据类型。例如,二阶差分编码只适用于INT32或INT64数据类型,存储浮点数需要乘以10m才能转换为整数,之后将数据转换为二进制流。压缩方法(SNAPPY)压缩二进制流,因此压缩方法的使用不再受数据类型的限制。IoTDB允许咱们开发者在创建时间序列时指定列的压缩方法,现在主要支持以下两种压缩方法:UNCOMPRESSEDSNAPPY单节点设置大家可以通过sbin文件夹下的启动服务器脚本来启动IoTDB。# Unix/OS X> nohup sbin/start-server.sh >/dev/null 2>&1 &or> nohup sbin/start-server.sh -c -rpc_port >/dev/null 2>&1 &# Windows> sbin\start-server.bat -c -rpc_port "-c "和"-rpc_port "是可选的选项"-c "指定系统配置文件目录选项“-rpc_port”指定rpc端口如果两个选项都指定了,则rpc _端口将覆盖中的rpc_port配置路径
  • [技术干货] 使用Apache IoTDB进行IoT相关开发的架构设计与功能实现(3)
    使用Apache IoTDB进行IoT相关开发的架构设计与功能实现(3)接下来我给大家继续介绍一下Apache IoTDB的数据类型和相关用法在显示时间戳时,IoTDB可以支持长类型和日期时间显示类型。日期时间显示类型可以支持用户定义的时间格式。自定义时间格式的语法如下表所示:**自定义时间格式的语法**SymbolMeaningPresentationExamplesGeraeraeraCcentury of era (>=0)number20Yyear of era (>=0)year1996xweekyearyear1996wweek of weekyearnumber27eday of weeknumber2Eday of weektextTuesday; Tueyyearyear1996Dday of yearnumber189Mmonth of yearmonthJuly; Jul; 07dday of monthnumber10ahalfday of daytextPMKhour of halfday (0~11)number0hclockhour of halfday (1~12)number12Hhour of day (0~23)number0kclockhour of day (1~24)number24mminute of hournumber30ssecond of minutenumber55Sfraction of secondmillis978ztime zonetextPacific Standard Time; PSTZtime zone offset/idzone-0800; -08:00; America/Los_Angeles‘escape for textdelimiter‘’single quoteliteral‘相对时间戳相对时间是指相对于服务器时间的时间now()和DATETIME时间。用法如下:Duration = (Digit+ ('Y'|'MO'|'W'|'D'|'H'|'M'|'S'|'MS'|'US'|'NS'))+RelativeTime = (now() | DATETIME) ((+|-) Duration)+**持续时间单位的语法**SymbolMeaningPresentationExamplesyyear1y=365 days1ymomonth1mo=30 days1mowweek1w=7 days1wdday1d=1 day1dhhour1h=3600 seconds1hmminute1m=60 seconds1mssecond1s=1 second1smsmillisecond1ms=1000_000 nanoseconds1msusmicrosecond1us=1000 nanoseconds1usnsnanosecond1ns=1 nanosecond1ns用法如下:now() - 1d2h //1 day and 2 hours earlier than the current server timenow() - 1w //1 week earlier than the current server time数据类型IoTDB一共支持以下6种数据类型:BOOLEAN (布尔型)INT32 (整数型)INT64 (长整数型)FLOAT (单精度浮点)DOUBLE (双精度浮点)TEXT (字符串)时间序列float和double类型可以指定最大点数,如果编码方法为,则为浮点数小数点后的位数RLE或者TS_2DIFF,如果未指定最大点数,系统将使用浮点精度在配置文件中iotdb-engine.properties。对于浮点数据值,数据范围是(MAX_VALUE,整数型。MAX_VALUE),而不是Float。MAX_VALUE,而max_point_number是19,这是因为Java中函数Math.round(float)的限制。对于双精度数据值,数据范围为(MAX_VALUE,长整数型。MAX_VALUE),而不是Double。MAX_VALUE,而max_point_number是19,这是因为Java(Long)中函数Math.round(double)的限制,MAX_VALUE=9.22E18。当用户在系统中输入的数据的数据类型与时间序列的数据类型不对应时,系统将报告类型错误。如下所示,二阶差分编码不支持布尔类型:IoTDB> create timeseries root.ln.wf02.wt02.status WITH DATATYPE=BOOLEAN, ENCODING=TS_2DIFFerror: encoding TS_2DIFF does not support BOOLEAN
  • 使用Apache IoTDB进行IoT相关开发的架构设计与功能实现(2)
    使用Apache IoTDB进行IoT相关开发的架构设计与功能实现(2)Apache IoTDB中常见的数据模型和术语通过上图我们可以非常清楚的了解到属性的覆盖范围和它们之间的隶属关系,并且根据属性的覆盖范围和它们之间的隶属关系,将其表达为属性层次结构。其层次关系为:power group layer - power plant layer - device layer - sensor layer。其中,ROOT是根节点,传感器层的每个节点称为一个叶节点。在使用IoTDB的过程中,可以用“.”直接连接从根节点到每个叶节点的路径上的属性,从而形成了IoTDB中一个timeseries的名称。例如,图中最左边的路径可以生成一个名为ROOT.ln.wf01.wt01.status 的路径。1.属性层次结构在获得时间序列的名称后,大家就需要根据数据的实际场景和规模来设置存储组。在一般场景下,数据通常是以组为单位到达的(即数据可能跨越电场和设备),为了避免写数据时频繁切换io,也为了满足用户对以组为单位的数据进行物理隔离的要求,可以在组层设置存储组。接下来我给大家介绍几个IoTDB中涉及的模型的基本概念:设备设备是真实场景中装备有传感器的装置。在IoTDB中,所有的传感器都应该有相应的设备。传感器传感器是实际场景中的检测设备,能够感知待测信息,并将感知到的信息转换成电信号或其他所需形式的信息输出,并发送给IoTDB。在IoTDB中,所有存储的数据和路径都以传感器为单位进行组织。存储组存储组用于让用户定义如何组织和隔离磁盘上不同的时间序列数据。属于同一存储组的时间序列将被连续写入相应文件夹中的同一文件。该文件可能由于用户命令或系统策略而关闭,因此来自这些传感器的下一个数据将存储在同一文件夹的新文件中。属于不同存储组的时间序列存储在不同的文件夹中。用户可以将任何前缀路径设置为存储组。假设有四个时间序列root.vehicle.d1.s1, root.vehicle.d1.s2, root.vehicle.d2.s1, root.vehicle.d2.s2,两个设备d1和d2在小路下面root.vehicle可能属于同一个车主或者同一个厂家,所以d1和d2关系密切。此时,可以将前缀path root.vehicle指定为一个存储组,这将使IoTDB能够将其下的所有设备存储在同一个文件夹中。下新添加的设备root.vehicle也将属于该存储组。其中完整路径(root.vehicle.d1.s1如上例所示)不允许设置为存储组。设置合理数量的存储组可以带来性能的提升:既不会因为存储文件或文件夹过多而导致IO频繁切换,也不会因为占用大量内存,导致内存文件频繁切换而导致系统变慢,也不会因为存储文件或文件夹过少而导致写命令阻塞,起到降低并发的作用。用户应该根据自己的数据大小和使用场景来平衡存储文件的存储组设置,以获得更好的系统性能。(大家如果对于存储组设置非常感兴趣的话,可以自己查询一下官方提供的存储组规模和性能测试报告)。其中时间序列的前缀必须属于一个存储组。在创建时间序列之前,用户必须设置该序列属于哪个存储组。只有设置了存储组的时间序列才能保存到磁盘上。一旦前缀路径被设置为存储组,就不能更改存储组设置。设置存储组后,不允许再次设置相应前缀路径的所有父层和子层(例如,在root.ln设置为存储组、根层和root.ln.wf01不允许设置为存储组。路径在IoTDB中,路径是符合以下约束的表达式:path: LayerName (DOT LayerName)+LayerName: Identifier | STAR我们称两条路径之间的中间部分为“.”作为一个层,因此root.A.B.C是一条有四层的路径。值得注意的是,在路径中,root是一个保留字符,只允许出现在下面提到的时间序列的开头。如果root出现在其他层中,则无法对其进行解析并报告错误。时间序列路径timeseries路径是IoTDB中的核心概念。时间序列路径可以被认为是产生时间序列数据的传感器的完整路径。IoTDB中的所有时间序列路径必须以root开始,以传感器结束。时间序列路径也可以称为完整路径。例如,如果车辆类型的设备1有一个名为sensor1的传感器,则其时间序列路径可表示为:root.vehicle.device1.sensor1.其中当前IoTDB支持的timeseries路径的层数必须大于等于四层(以后会改为两层)。前缀路径前缀路径是指timeseries路径的前缀所在的路径。前缀路径包含以该路径为前缀的所有时间序列路径。例如,假设我们有三个传感器:root.vehicle.device1.sensor1, root.vehicle.device1.sensor2, root.vehicle.device2.sensor1,前缀路径root.vehicle.device1包含两个时间序列路径root.vehicle.device1.sensor1和root.vehicle.device1.sensor,期间root.vehicle.device2.sensor1被排除在外。带星形的路径为了更方便快捷地表示多个时序路径或前缀路径,IoTDB为用户提供了路径指针。*可以出现在路径的任何一层。根据所处的位置*出现时,带有星号的路径可以分为两种类型:*出现在路径的末端;*出现在路径中间;*出现在路径的末尾的时候,它表示(*)+,它是一层或多层*。举个例子,root.vehicle.device1.*表示所有前缀为root.vehicle.device1层数大于或等于4层,如root.vehicle.device1.*,root.vehicle.device1.*.*, root.vehicle.device1.*.*.*等。当...的时候*出现在路径的中间,它代表*本身,即一层。举个例子,root.vehicle.*.sensor1表示前缀为的4层路径root.vehicle后缀是sensor1。在这里我们应该注意:*不能放在路径的开头。路径包含*与前缀路径具有相同的含义,例如,root.vehicle.*和root.vehicle是一样的。时间戳时间戳是产生数据的时间点。它包括绝对时间戳和相对时间戳绝对时间戳IoTDB中的绝对时间戳分为LONG和DATETIME两种(包括DATETIME-INPUT和DATETIME-DISPLAY)。当用户输入时间戳时,他可以使用长类型时间戳或日期时间输入类型时间戳,日期时间输入类型时间戳支持的格式如下表所示:**日期时间输入类型时间戳的支持格式* *Formatyyyy-MM-dd HH:mm:ssyyyy/MM/dd HH:mm:ssyyyy.MM.dd HH:mm:ssyyyy-MM-dd’T’HH:mm:ssyyyy/MM/dd’T’HH:mm:ssyyyy.MM.dd’T’HH:mm:ssyyyy-MM-dd HH:mm:ssZZyyyy/MM/dd HH:mm:ssZZyyyy.MM.dd HH:mm:ssZZyyyy-MM-dd’T’HH:mm:ssZZyyyy/MM/dd’T’HH:mm:ssZZyyyy.MM.dd’T’HH:mm:ssZZyyyy/MM/dd HH:mm:ss.SSSyyyy-MM-dd HH:mm:ss.SSSyyyy.MM.dd HH:mm:ss.SSSyyyy/MM/dd’T’HH:mm:ss.SSSyyyy-MM-dd’T’HH:mm:ss.SSSyyyy.MM.dd’T’HH:mm:ss.SSSyyyy-MM-dd HH:mm:ss.SSSZZyyyy/MM/dd HH:mm:ss.SSSZZyyyy.MM.dd HH:mm:ss.SSSZZyyyy-MM-dd’T’HH:mm:ss.SSSZZyyyy/MM/dd’T’HH:mm:ss.SSSZZyyyy.MM.dd’T’HH:mm:ss.SSSZZISO8601 standard time format这次先给大家介绍到这里,下次再来给小伙伴们介绍时间戳和相对时间戳的数据格式~
  • [技术干货] 使用Apache IoTDB进行IoT相关开发的架构设计与功能实现(1)
    使用Apache IoTDB进行IoT相关开发的架构设计与功能实现(1)当今社会,物联网技术的发展带来了许多繁琐的挑战,尤其是在数据库管理系统领域,比如实时整合海量数据、处理流中的事件以及处理数据的安全性。例如,应用于智能城市的基于物联网的交通传感器可以实时生成大量的交通数据。据估计,未来5年,物联网设备的数量将达数万亿。物联网产生大量的数据,包括流数据、时间序列数据、RFID数据、传感数据等。要有效地管理这些数据,就需要使用数据库。数据库在充分处理物联网数据方面扮演着非常重要的角色。因此,适当的数据库与适当的平台同等重要。由于物联网在世界上不同的环境中运行,选择合适的数据库变得非常重要。1.什么是IoTDB有的小伙伴可能不了解什么是IoTDB,我先来给大家简单介绍一下:IoTDB即物联网数据库,是一个面向时间序列数据的集成数据管理引擎,可以为用户提供特定的数据收集、存储和分析服务。由于其轻量级结构、高性能和可用特性,以及与Hadoop和Spark ecology的紧密集成,IoTDB满足了物联网工业领域的海量数据集存储、高速数据输入和复杂数据分析的要求。2.IoTDB的体系结构IoTDB套件可以提供真实情况下的数据采集、数据写入、数据存储、数据查询、数据可视化和数据分析等一系列功能,下图显示了IoTDB套件的所有组件带来的整体应用程序架构。如图所示呢,咱们广大用户可以使用JDBC将设备上传感器收集的时间序列数据导入本地/远程IoTDB。这些时间序列数据可以是系统状态数据(如服务器负载和CPU内存等)。消息队列数据、来自应用程序的时间序列数据或数据库中的其他时间序列数据。用户也可以将数据直接写入TsFile(本地或HDFS)。对于写入IoTDB和本地TsFile的数据,大家可以使用TsFileSync工具将TsFile同步到HDFS,从而在Hadoop或Spark数据处理平台上实现异常检测、机器学习等数据处理任务。对于写入HDFS或本地TsFile的数据,用户可以使用TsFile-Hadoop-Connector或TsFile-Spark-Connector来允许Hadoop或Spark处理数据。分析的结果可以用同样的方式写回TsFile。还有呢,IoTDB和TsFile提供了客户端工具,完全可以满足用户以SQL形式、脚本形式和图形形式编写和查看数据的各种需求。3.IoTDB的体系特征灵活部署IoTDB为用户提供了云上一键安装工具、一次解压即可使用的终端工具以及云平台与终端工具之间的桥梁工具(数据同步工具)。存储成本低IoTDB可以达到很高的磁盘存储压缩比,这意味着IoTDB可以用更少的硬件磁盘成本存储同样多的数据。高效的目录结构IoTDB支持来自智能网络设备的复杂时间序列数据结构的高效组织,来自同类设备的时间序列数据的组织,海量复杂时间序列数据目录的模糊搜索策略。高吞吐量读写IoTDB支持上百万低功耗设备的强连接数据访问,支持上面提到的智能联网设备和混合设备的高速数据读写。丰富的查询语义IoTDB支持跨设备和传感器的时间序列数据的时间对齐、时间序列域的计算(频域变换)和时间维度丰富的聚合函数支持。容易上手IoTDB支持类SQL语言、JDBC标准API和易于使用的导入/导出工具。自身和开源生态系统紧密集成IoTDB支持Hadoop、Spark等。分析生态系统和Grafana可视化工具。4.IoTDB的文件类型在IoTDB中呢,需要存储的数据种类繁多。现在我来给大家介绍IoTDB的数据存储策略,方便大家对IoTDB的数据管理有一个直观的了解。首先呢,IoTDB存储的数据分为三类,即数据文件、系统文件和预写日志文件。(1)数据文件数据文件存储用户写入IoTDB的所有数据,IoTDB包含TsFile和其他文件。TsFile存储目录可以用data_dirs来配置相关项目,其他文件通过其他特定的数据来配置项目。为了更好地支持用户的磁盘空间扩展等存储需求,IoTDB支持多种文件目录存储方式进行TsFile存储配置。用户可以将多个存储路径设置为数据存储位置,大家可以指定或自定义目录选择策略。(2)系统文件系统文件包括模式文件,模式文件存储IoTDB中数据的元数据信息。它可以通过配置base_dir配置项目。(3)预写日志文件预写日志文件存储WAL文件。它可以通过配置wal_dir配置项目。(4)设置数据存储目录的示例为了更清楚地理解配置数据存储目录,我在这给出一个示例。存储目录设置中涉及的所有数据目录路径有:base_dir、data_dirs、multi_dir_strategy、wal_dir,分别指系统文件、数据文件夹、存储策略、预写日志文件。配置项的示例如下:base_dir = $IOTDB_HOME/datadata_dirs = /data1/data, /data2/data, /data3/datamulti_dir_strategy=MaxDiskUsableSpaceFirstStrategywal_dir= $IOTDB_HOME/data/wal这段代码并不复杂,相信很多小伙伴都应该可以看懂,我在这里给大家简单说明一下下,设置以上配置后,系统将:将所有系统文件保存在$io TDB _ HOME/data中将TsFile保存在/data1/data、/data2/data、/data3/data中。选择策略是MaxDiskUsableSpaceFirstStrategy,即每次数据写入磁盘时,系统会自动选择剩余磁盘空间最大的目录来写入数据。将WAL数据保存在$IOTDB_HOME/data/wal中这次先为大家介绍到这,下次我再来给小伙伴们分享之前我自己的IoTDB学习经历~
  • 三种设计模式
    创建型 创建型比较好理解,他抽象了对象的实例化过程,将系统与实例的创建解耦。实例由专门的工厂来实现,从而使系统针对实例的抽象接口编程,不依赖任何接口的实现,从而让使用者不需要关注对象的创建细节单例模式 (Singleton)模式:某个类只能生成一个实例,该类提供了一个全局访问点供外部获取该实例,其拓展是有限多例模式。 原型模式 (Prototype)模式:将一个对象作为原型,通过对其进行复制而克隆出多个和原型类似的新实例。 工厂模式 (FactoryMethod)模式:定义一个用于创建产品的接口,由子类决定生产什么产品。 抽象工厂模式 (AbstractFactory)模式:提供一个创建产品族的接口,其每个子类可以生产一系列相关的产品。 建造者模式 将一个复杂对象分解成多个相对简单的部分,然后根据不同需要分别创建它们,最后构建成该复杂对象。 结构型 结构型模式主要用于处理类和对象的组合,以获得更大的结构。这个概念可以区分大多设计模式,但是也有些比较模糊的,例如:代理模式,它既完成了组合 也有职责的分配 但是它依赖被归类于结构型我们的目的是区分大多数设计模式,所以记住一些比较特别的就可以啦代理(Proxy)模式:为某对象提供一种代理以控制对该对象的访问。即客户端通过代理间接地访问该对象,从而限制、增强或修改该对象的一些特性。 适配器(Adapter)模式:将一个类的接口转换成客户希望的另外一个接口,使得原本由于接口不兼容而不能一起工作的那些类能一起工作。 桥接(Bridge)模式:将抽象与实现分离,使它们可以独立变化。它是用组合关系代替继承关系来实现的,从而降低了抽象和实现这两个可变维度的耦合度。 装饰(Decorator)模式:动态地给对象增加一些职责,即增加其额外的功能。 外观(Facade)模式:为多个复杂的子系统提供一个一致的接口,使这些子系统更加容易被访问。 享元(Flyweight)模式:运用共享技术来有效地支持大量细粒度对象的复用。 组合(Composite)模式:将对象组合成树状层次结构,使用户对单个对象和组合对象具有一致的访问性。 行为型 行为型涉及到算法和对象间职责的分配,它还处理着对象或类之间的通信模式。在程序运行的时候总是流程复杂,需要很好的协调工作,这个时候就是行为型的出场啦。常见行为型模式:模板方法(Template Method)模式:定义一个操作中的算法骨架,将算法的一些步骤延迟到子类中,使得子类在可以不改变该算法结构的情况下重定义该算法的某些特定步骤。 策略(Strategy)模式:定义了一系列算法,并将每个算法封装起来,使它们可以相互替换,且算法的改变不会影响使用算法的客户。 命令(Command)模式:将一个请求封装为一个对象,使发出请求的责任和执行请求的责任分割开。 职责链(Chain of Responsibility)模式:把请求从链中的一个对象传到下一个对象,直到请求被响应为止。通过这种方式去除对象之间的耦合。 状态(State)模式:允许一个对象在其内部状态发生改变时改变其行为能力。 观察者(Observer)模式:多个对象间存在一对多关系,当一个对象发生改变时,把这种改变通知给其他多个对象,从而影响其他对象的行为。 中介者(Mediator)模式:定义一个中介对象来简化原有对象之间的交互关系,降低系统中对象间的耦合度,使原有对象之间不必相互了解。 迭代器(Iterator)模式:提供一种方法来顺序访问聚合对象中的一系列数据,而不暴露聚合对象的内部表示。 访问者(Visitor)模式:在不改变集合元素的前提下,为一个集合中的每个元素提供多种访问方式,即每个元素有多个访问者对象访问。 备忘录(Memento)模式:在不破坏封装性的前提下,获取并保存一个对象的内部状态,以便以后恢复它。 解释器(Interpreter)模式:提供如何定义语言的文法,以及对语言句子的解释方法,即解释器。
  • [其他] 【开天aPaaS专家说】如何应对软件可变性?这4种常用的方法肯定要知道
    软件可变性的相关思考(一)作者:陈星亮(华为云开天aPaaS专家)软件可变性(Software Variability)是指在一定上下文中一个软件系统被有效改变(扩展、配置、调整)的能力。在许多软件系统的开发运行阶段乃至整个生命周期中,软件可变性都是其设计开发者所要面对的基本问题。       在大多数系统中,可变性表现为软件在某个或某些可变点处对变体的绑定。其中可变点是指软件中可以发生变化(绑定变体)的位置,而变体则是变化发生时,人或机器可以在相应位置做出的选择。       可以看出,在软件的运行实例中,变化发生的位置、变化发生的程度是在设计阶段预定义的。而这种定义又在很大程度上依赖于软件的需求分析以及在此基础上做出的种种假设。系统虽然具有变体绑定能力来满足既定的需求,但可变性模型(可变点、变体以及它们之间的关系)本身没有变化,导致软件在应对变化的需求或环境时存在一定限制。       在传统意义上,软件运行时可变性模型被认为是静态的。在许多研究工作中,模型被以只读的方式访问,以支持软件适应外部的环境。人们将注意力集中在可变性绑定方面(即为什么(重新)绑定变体、绑定什么变体、怎样绑定),而忽视了对运行时可变性模型本身蕴含的限制的突破。随着计算机技术的发展进步、用户需求的增多及变化的加快、系统驻留环境的开放、外界对系统灵活性和可伸缩性要求的提高,这种限制显得愈加突出。       针对软件可变性,开发者们根据软件实现要求和成本投入,采取软件预留配置点、动态软件产品线、运行时可变性动态绑定、多变非核心功能的快速开发等方法来应对。1、软件预留配置点:软件预留配置点可以自动地根据环境的变化来调整自身。换言之,它可以收集和分析有关环境的信息,基于分析的结果决定是否改变自己的行为,如果是,再采取调整动作。系统设计者指出或假设系统所面对环境变化等信息,确定系统所能够感知和收集的环境数据,进而以一定的数据结构将其表示在计算机内,而后才能设计相应的算法对这些信息进行分析并做出决策。在执行环节对于自身的调整,实际上是软件在可变点处对于变体的动态绑定,这是其运行时可变性的表现。关键点:1)设计者难以在系统部署运行之前设想所有的需求或环境的变化,当超过预期的变化出现时,已经成型的系统无法自动地收集与其相关的信息。2)并未改变可变性要素的数量、属性或关系。只能在设计开发时预定的范围内,进行选择。2、动态软件产品线:动态软件产品线包括一组核心资产和从资产开发而来的一系列具有共同特征的软件产品。与传统软件产品线对比,动态软件产品线更关注软件的运行时可变性,本质上是建立具备可配置能力的一系列软件。关键点:1)产品线自身的设计者可以快速开发出具有运行时可变性的软件产品,并赋予其自主选择绑定变体的能力。2)其关注的运行时可变性大部分都是封闭的而非开放的,这意味着运行时可变性应对的是开发者在设计期设想的环境变化,导致软件产品难以应对超过预期的环境变化。3、运行时可变性动态绑定运行时可变性动态绑定机制描述一个运行中的软件如何在一个可变点绑定相应的变体,是软件可变性实现的核心。绑定机制涉及对构件内部结构和行为的调整,包括对子构件的重配置和动态绑定。关键点:1) 对构件行为的调整往往通过重新组织构件的工作流或是重新设置构件内部参数来实现。2) 对于突破了原有设计范围内的变化,需要能被系统识别,并自动生成对应的逻辑。4、多变非核心功能的快速开发为应对行业应用不断变化的情况,亦有思路是降低软件应用开发的难度,将软件的稳定的核心功能与多变的功能分开。对于多变非核心功能,以提供低码开发的方式,便于开发者能快速的根据诉求,进行近场快速开发并投入使用。关键点:1) 软件设计者需要能识别出稳定的核心功能、多变的非核心功能。并且能够在两者之间建立好连接。2) 提供便捷的工具,使得多变的非核心功能能够被近场开发者,甚至是使用者自己能快速实现。如何提升软件的可变性,让软件能够从容应对业务的变化,一直都是软件工程领域的一个重要话题。针对上述4种在应对软件可变性经常用到的方法,各自都有其特点,分别在不同的场景下使用。
  • [其他] 【术语科普】关于集成工作台那些难懂的词儿,看这篇秒懂!
    关于华为云开天集成工作台,有很多疑问?什么是流?什么是工作流、业务流、集成流?什么是流处理、流编排……这么多问号,头都要大了?!别急,往下看,关于流程模式那些难懂的词儿,在这儿全搞懂!流程(Process)流程图(Flowchart)1.流程(基本流程)图,又称程序框图,是算法、工作流或流程的一种框图表示,它以不同类型的框代表不同种类的步骤,每两个步骤之间则以箭头连接。2.流程图大都有2种符号:①步骤,通常称作“活动”,常以长方形来表示;②决定,常以钻石形来表示。控制流程(Control Flow)1.控制流程(也称为流程控制)是电脑运算领域的用语,意指在程序执行时,个别的指令(或是陈述、子程序)执行或求值的顺序。2.编程语言所提供的流程控制指令一般可以分为以下几种:继续执行位在不同位置的一段指令(无条件分支指令)。若特定条件成立时,执行一段指令,例如C语言的switch指令,是一种有条件分支指令。执行一段指令若干次,直到特定条件成立为止,例如C语言的for指令,仍然可视为一种有条件分支指令。执行位在不同位置的一段指令,但完成后会继续执行原来要执行的指令,包括子程序、协程(coroutine)及计算续体(continuation)。停止程序,不执行任何指令(无条件的终止)。控制流图(Control Flow Chart)利用数学中图的表示方式,标示计算机程序执行过程中所经过的所有路径。控制流图中的每个顶点都对应一个程式基本块,也就是一段没有分支指令、也没有分支目的的程式码,基本块的开始是分支目的,而基本块会以分支为结束。控制流程中会用有向边来表示分支。 工作流(Workflow)工作流是对工作流程及其各操作步骤之间业务规则的抽象、概括描述。工作流建模,即将工作流程中的工作如何前后组织在一起的逻辑和规则,在计算机中以恰当的模型表达并对其实施计算。工作流要解决的主要问题是:为实现某个业务目标,利用计算机在多个参与者之间按某种预定规则自动传递文档、信息或者任务。A workflow consists of an orchestrated and repeatable pattern of activity, enabled by the systematic organization of resources into processes that transform materials, provide services, or process information. It can be depicted as a sequence of operations, the work of a person or group, the work of an organization of staff, or one or more simple or complex mechanisms.业务流程(Business Process)“一系列结构化的、可度量的活动,设计它的目标是为特定客户或市场产生规定的输出。”“一种活动的集合,具有一种或多种输入和确定的输出,这些输出对客户产生价值。”“业务过程是为产生产品或服务而设计的一系列步骤。多数的过程(……)跨越职能,贯穿组织机构图上矩形之间的空白。一些过程的结果是由组织外的客户所接受的产品或服务,称为主要过程;另一些过程的产出不为外部客户所见,但是有效管理所必须的,称为支持过程。”“互相连接的活动集合,它们将输入转换为输出。理想情况下,在过程中发生的转换将为输入增加价值,并形成对接受者更有效用的输出,无论接受者处于上游还下游。”可界定性:必须清晰地定义其边界、输入和输出。顺序:构成过程的活动,必须在时间和空间里具有确定的顺序。客户:过程的结果必须有接收者——客户。增值:在过程中发生的转换必须为接收者增加价值,无论接收者是在过程的上游还是下游。嵌入性:过程不能自己单独存在,它必定嵌入在组织结构中。跨越职能:过程通常但非必须跨越多个职能。“业务过程”的意义更一般化,学术讨论中使用较多;“业务流程”的意义更具体,更倾向于指称具体的活动与任务的流,使用上更大众化。业务流程模型和标记法(BPMN, Business Process Model and Notation)最初由业务流程管理倡议组织(BPMI, Business Process Management Initiative)开发,名称为"Business Process Modeling Notation",即“业务流程建模标记法”。BPMI于2005年与对象管理组织(OMG, Object Management Group)合并。2011年1月OMG发布2.0版本,同时改为现在的名称。BPMN的目标是,通过提供一套既符合业务人员直观又能表现复杂流程语义的标记法,同时为技术人员和业务人员从事业务流程管理提供支持。四种基本要素:流对象(Flow Object): 事件(Events),活动(Activities),网关(Gateways)连接对象(Connecting Objects): 顺序流(Sequence Flow),消息流(Message Flow),关联(Association)泳道(Swimlanes): 池(Pool),道(Lane)器物(Artifacts/Artefacts): 数据对象(Data Object),组(Group),注释(Annotation)数据流、数据流程图(Data Flow Diagram)1.      数据流或数据流程是一种软件范式,该范式的主要思想是把处理过程划分为可并行执行的子阶段(流水线),数据流又可以称为流处理(Stream Process)或反应式编程(Reactive Programming)。2.      数据流图或数据流程图。数据流图是描述系统中数据流程的一种图形工具,它标志了一个系统的逻辑输入和逻辑输出,以及把逻辑输入转换逻辑输出所需的加工处理。3.      数据流图不是传统的流程图,数据流也不是控制流。数据流图是从数据的角度来描述一个系统。数据流程编程(Dataflow Programming)数据流程编程是一种编程范式,它将程序建模为数据在运算(Operation)之间流动的有向图,从而实现了数据流程原理和架构。数据流程编程语言,共享了纯函数式语言的某些特征,比如单赋值,并且开发它们的动因,通常是为了向更适合数值处理的语言,增加函数式编程概念。传统上,程序被建模为,按照特定次序发生的一系列运算;这称为指令式编程,这种编程方式也叫做顺序式、过程式、控制流程(意指程序选择某个特定路径)。程序聚焦于命令,符合于冯·诺伊曼的顺序式编程愿景,而数据通常是“静止的”(在上下文)。与之相对,数据流程编程强调了数据的流动(输入输出),并将程序建模为一系列的连接。显式的定义输入和输出的连接运算,它的功能类似于黑箱。一个运算在它的所有输入成为有效时立即运行。因此,数据流程语言是天然并行的,并可在大型的、去中心化的系统上运作。流处理(Stream Processing)流处理(Stream Processing)是一种计算机编程范型,相当于数据流程编程,事件流处理,和反应式编程,其允许一些应用更容易地利用了有限形式的并发处理。这些应用程序可以使用多个计算单元,而无需明确管理这些单元之间的分配,同步或通信。流处理通过限制可执行的并发计算来简化并发软件和硬件。给定一个数据序列(流处理),一系列操作(内核函数)被应用到流中的每个元素。基于流程编程(Flow Based Programming)基于流程(flow-based)的编程,缩写为FBP,是一种编程范型,它将应用定义为黑箱进程的网络,它们经过预先定义的连接,通过消息传递来交换数据,而这里的连接是在“外部”指定给进程的。这些黑箱进程不需要更改内部,就可以无尽的重新连接而形成不同的应用。FBP因而是天然基于构件的。FBP是一种特殊形式的数据流程编程,它基于了有界缓冲区,带有确定生存时间的信息包,命名端口,和独立的连接的定义。端口向FBP提供了构件重用功能,使得FBP成为基于构件的架构。集成流(Integration Flow)数据流的一种,用于企业集成的场景,聚焦于企业应用间集成。企业集成架构模式定义了一组可复用组件,支持灵活连接组装为目标企业应用集成流程。集成流强调从源应用(EndPoint)触发(Construct),经过中间处理(Channel、Routing、Transformation),送达目的应用(Endpoint),是在企业集成领域总结出的架构范式。资料来源:[1]https://baike.baidu.com/item/%E6%B5%81%E7%A8%8B/31013?fr=aladdin[2]https://zh.wikipedia.org/wiki/%E6%B5%81%E7%A8%8B%E5%9B%BE[3]https://zh.wikipedia.org/wiki/%E6%8E%A7%E5%88%B6%E6%B5%81%E7%A8%8B[4]https://zh.wikipedia.org/wiki/%E6%8E%A7%E5%88%B6%E6%B5%81%E7%A8%8B[5]https://zh.wikipedia.org/wiki/%E5%B7%A5%E4%BD%9C%E6%B5%81%E6%8A%80%E6%9C%AF[6]https://en.wikipedia.org/wiki/Workflow[7]https://zh.wikipedia.org/wiki/%E4%B8%9A%E5%8A%A1%E8%BF%87%E7%A8%8B[8]https://zh.wikipedia.org/wiki/%E4%B8%9A%E5%8A%A1%E6%B5%81%E7%A8%8B%E6%A8%A1%E5%9E%8B%E5%92%8C%E6%A0%87%E8%AE%B0%E6%B3%95[9]https://zh.wikipedia.org/wiki/%E8%B3%87%E6%96%99%E6%B5%81%E7%A8%8B%E5%9C%96[10]https://zh.wikipedia.org/wiki/%E6%95%B0%E6%8D%AE%E6%B5%81%E7%A8%8B%E7%BC%96%E7%A8%8B[11]https://zh.wikipedia.org/wiki/%E4%B8%B2%E6%B5%81%E8%99%95%E7%90%86[12]https://zh.wikipedia.org/wiki/%E5%9F%BA%E4%BA%8E%E6%B5%81%E7%A8%8B%E7%BC%96%E7%A8%8B[13]https://www.enterpriseintegrationpatterns.com/patterns/messaging/
  • [问题求助] 华为云CodeCheck服务可以发现哪些架构设计的问题?
    1.请问华为云CodeCheck服务可以发现哪些架构设计的问题?架构问题对应的检测规则是什么? 架构问题对应的检测规则如何查看?2.请问华为云CodeCheck服务,与开源工具Sonar的本质区别是什么?
  • [资料专区] 架构设计分享
    架构设计分享
总条数:37 到第
上滑加载中