罗生门:一个简单查询实现引发的思考

探讨微服务环境下数据查询的不同实现方式,分析各自优劣,并提出全局最优解。强调单一职责原则,推荐事件溯源模式同步数据。

站在不同的角度看待同一个问题,会得出不同的结论。对于程序的实现也一样。

一、查询功能实现的罗生门

不久前公司遇到一个场景,也是微服务状态下肯定会遇到的一个场景(以下对比真实情况有所抽象和改编):

  • 某一个服务A,需要实现一个较为边缘的功能;

  • 这个边缘功能需要用到另外一个服务B管控的大量数据用于展示;

  • 同时对于展示的数据需要打一个标志(更新),该标志后续需要用于过滤显示的数据。

对于这个功能需求,实现无非包含三个大方向:

  • 实现一、服务A直接利用服务B的数据库进行查询及更新;

  • 实现二、服务A的数据库导入服务B里所有需要的数据,然后服务A在其自身的数据库中对数据进行更新;

  • 实现三、服务A自行存储打标志信息(更新),需要B的数据时直接向服务B实时查询,服务A在应用代码中合并多方数据得出结果后,向用户反馈。

对于不同的实现,各方有不同的态度(自行瞎编)。

对于实现一:

  • 服务A开发人员:这个实现极好,最简单、最省事;

  • 服务B开发人员:为啥我们的数据库要存跟我们服务职责无关的数据?这会导致我们的代码腐化。

对于实现二:

  • 服务A开发人员:实现这么个简单功能,还要导入维护这么大量的数据,太麻烦;

  • 服务B开发人员:嗯,数据给你,你爱怎么折腾就怎么折腾。

对于实现三:

  • 服务A开发人员:数据分布在不同的库,在应用中合并处理得到对应结果的过程的开发复杂度高且代码不够优雅;

  • 服务B开发人员:要给你提供查询接口,不是不可以,但是如果每个服务有相关查询需求我们都要协助改这也很烦。

二、如何破局?

服务A、服务B开发人员站在他们自己的角度分析这些实现得出的这些想法都是正确的。但如果只站在自己的立场,互不让步的话,事情是无法推进的。

个人认为这个问题应该

跳出自身立场,站在更高角度,选出全局收益最高的实现

全局收益 = Σ局部收益 - Σ局部代价

对于上述具体场景,站在全局得失角度的考虑,个人觉得应该是这样的:

  • 这是一个边缘功能,使用的人数和频率不高,我们实现该功能的代价一定不能高于其产生的收益;

  • 方案一在服务B的数据库中存储与其无关的数据,违反单一职责原则,虽然该实现整体很简单,但其会导致服务B代码/数据腐化,不利于服务B的后续演化;

    • 有人或许会说,只是一个简单的标志,不至于;

    • 但如果每个其他服务都要求服务B为其进行改造,存储服务B不应该存储的数据,那服务B还怎么重构演化?这不就变回单体应用了么?

  • 方案二将所需数据从服务B全部导入服务A的话,除却存储服务B数据所需的物理资源消耗外,无论是全量批量导入、增量批量导入还是流式导入我们都需要关心其导入到服务A中数据的正确性。尤其是跑批,我相信是无数开发和运维的噩梦。因此个人觉得方案二的投入可能已大于其能获得的收入;

  • 对于方案三。

    • 要求服务B提供对其自身数据的查询接口,只要其查询接口是一个较为通用的,而并非对服务A专门定制的话,其本应属于服务B的职责,不存在代码腐化;

    • 要求服务A在内存中合并数据进行展示,由于服务B提供通用接口的能力的限制、拼装筛选数据逻辑复杂,复杂的查询确实需要很大开发量;

    • 但因为该功能确实较为边缘,产出价值并不是特别巨大,因此我们可以要求业务对相关查询进行简化,不要想着面面俱到,以减少开发成本,将人力投入到更有需要的地方。

综上,个人觉得针对该场景应该选择方案三。

三、何时选用方案二

方案一是单体应用的老路,不再讨论及考虑。以下分析下方案二的使用场景。

我们上面提到方案二需要存储数据、同步数据、维护数据准确性需要给到不少的代价,那何时选用方案二?

当然是获得的收益远大于付出的代价的时候,例如服务A需要为客户提供一个高频复杂的查询计算、并因此能获得一个很高的收益,此时我们就可以将B的数据导入到服务A,这样我们可以更方便的处理数据,提供更简洁高效的服务。

这里扩展一下,我们要如何同步服务B的数据呢?因批处理不实时、binlog等手段直接暴露底层数据结构增加服务间耦合,个人觉得利用队列实现的事件溯源模式是一个不错的选择,后续会写文章介绍相关实现。

四、总结

对于微服务场景下的数据查询,对于原始数据提供方:

  • 不应该接受非本服务的任何逻辑及数据;

  • 提供通用(非定制)的查询接口,以满足其他服务基础查询需求;

  • 提供获取全量业务层级数据的方式,如事务溯源模式,发布业务层级的每一次状态变化(状态变化的形态要像API一样保持兼容性)。

对于使用数据方:

  • 尽可能地使用对方通用的查询接口;

  • 综合考虑收益及代价后,可在本地数据库导入其他服务的数据,以实现更高效灵活的业务逻辑。

(对于不使用上述总结规则的微服务容易陷入一个怪圈,如下,大家看看就好)

五、最后

本文为个人的一些思考,仅为抛砖引玉,欢迎各位提出自己的一件。

如本文对你有所启发及帮助,请转发以帮助更多的人,谢谢!

六、引用

  • 百度百科——罗生门

    • https://baike.baidu.com/item/罗生门/52523?fr=aladdin

  • data-dichotomy-rethinking-the-way-we-treat-data-and-services

    • https://www.confluent.io/blog/data-dichotomy-rethinking-the-way-we-treat-data-and-services/

内容概要:本文围绕六自由度机械臂的人工神经网络(ANN)设计展开,重点研究了正向与逆向运动学求解、正向动力学控制以及基于拉格朗日-欧拉法推导逆向动力学方程,并通过Matlab代码实现相关算法。文章结合理论推导与仿真实践,利用人工神经网络对复杂的非线性关系进行建模与逼近,提升机械臂运动控制的精度与效率。同时涵盖了路径规划中的RRT算法与B样条优化方法,形成从运动学到动力学再到轨迹优化的完整技术链条。; 适合人群:具备一定机器人学、自动控制理论基础,熟悉Matlab编程,从事智能控制、机器人控制、运动学六自由度机械臂ANN人工神经网络设计:正向逆向运动学求解、正向动力学控制、拉格朗日-欧拉法推导逆向动力学方程(Matlab代码实现)建模等相关方向的研究生、科研人员及工程技术人员。; 使用场景及目标:①掌握机械臂正/逆运动学的数学建模与ANN求解方法;②理解拉格朗日-欧拉法在动力学建模中的应用;③实现基于神经网络的动力学补偿与高精度轨迹跟踪控制;④结合RRT与B样条完成平滑路径规划与优化。; 阅读建议:建议读者结合Matlab代码动手实践,先从运动学建模入手,逐步深入动力学分析与神经网络训练,注重理论推导与仿真实验的结合,以充分理解机械臂控制系统的设计流程与优化策略。
<think>好的,用户的问题是关于“罗生门蜂鸣器音乐51”的相关资源或信息,并提到IT相关性待确认。首先需要分解关键词:“罗生门”、“蜂鸣器”、“音乐”、“51”。罗生门可能指电影、小说,或者某个同名项目。蜂鸣器通常指电子设备中的发声元件,常用于生成简单音调。音乐51可能指某个编号或51单片机相关的音乐编程。接下来,考虑用户意图。用户可能是在寻找如何用蜂鸣器制作与罗生门相关的音乐,或者某个特定的项目、代码示例。需要确认“51”是否指51单片机(如Intel8051),这在嵌入式开发中常见,用于控制蜂鸣器播放音乐。IT相关性可能涉及硬件编程、音乐合成或开源项目。现在需要搜索相关资源。首先检查是否有开源项目或教程涉及51单片机与蜂鸣器播放音乐,特别是与“罗生门”主题相关的。查找GitHub、优快云、电子论坛等平台。例如,搜索“罗生门蜂鸣器音乐51单片机”可能找到相关代码或项目。此外,确认是否存在名为“罗生门”的音乐作品或MIDI文件,可能被改编为蜂鸣器播放。需要注意,用户可能混淆了术语,比如“罗生门”可能指某个游戏或DEMO场景中的音乐,而“51”指单片机型号。需要验证这些信息是否存在关联。例如,某些创客项目会用蜂鸣器播放经典音乐,如电影主题曲,可能包括《罗生门》的配乐。也可能用户提到的“51”是某个项目编号或版本号,需进一步确认。整合信息时,应分步骤说明可能的资源获取途径,如开源代码库、硬件教程、音乐转换方法等。同时,需指出IT相关性,如嵌入式编程、音频信号生成原理。若资源有限,需建议扩展搜索关键词或相关技术社区咨询。最后生成相关问题需围绕用户原问题,可能涉及具体代码示例、硬件连接方法、音乐转换工具等,确保相关问题有助于用户深入解决当前疑问。</think>根据现有公开资料检索,"罗生门蜂鸣器音乐51"可能涉及嵌入式系统开发中的蜂鸣器音乐编程实践。结合IT领域分析,以下信息可供参考: **蜂鸣器音乐编程原理** 蜂鸣器通过PWM波控制发声频率,每个音符对应特定频率值。51系列单片机常用定时器/计数器生成精确频率信号。音乐数据通常以数组形式存储,包含音符和节拍信息,典型结构: ```c #define N 51 // 可能指音乐长度 unsigned int code song[N] = {0x2204,0x2202,...}; // 高位字节存储音符频率,低位存储节拍 ``` **音乐数据转换方法** 1. 使用MIDI转蜂鸣器音乐工具(如MIDI2Tone)将音乐文件转换为单片机可识别的数据格式 2. 根据51单片机时钟频率调整频率参数,计算公式: $$f_{timer} = \frac{f_{osc}}{12 \times (256 - TH1)}$$ 3. 节拍控制通过延时函数实现,需计算单片机指令周期时间 **开源项目参考** GitHub平台存在多个基于STC89C52的蜂鸣器音乐项目,部分项目包含《罗生门》等影视配乐实现。典型项目结构包含: - 硬件电路原理图(包含驱动电路) - 音乐数据头文件(*.h) - 定时器中断服务程序 - 主控制循环逻辑 **验证IT相关性要点** 1. 确认"51"指代Intel 8051架构单片机 2. 检查代码中是否存在特定音乐哈希值或标识符 3. 验证硬件平台与开发环境(如Keil uVision)
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值