实习问题总结

为什么使用GRPC作为通信方式,对比如REST好处在哪里?

  • 使用protobuf作为序列化格式,以二进制进行传输,减小了数据包的大小,效率高
    •  proto强类型定义、支持复杂数据类型,编译运行可以进行严格的数据验证,每个字段都有唯一编号,作为序列化和反序列化的依据
    • JSON便于阅读,没有强类型约束,通过键序列化和反序列化
    • proto二进制,空间小,效率高,解析速度快
    • 更适合高性能,强类型系统
  • 支持HTTP2,本身HTTP2就是字节传输,多路复用、首部压缩,提高了传输性能和并发处理能力。
  • 强类型定义:通过.proto定义服务和消息格式,提供了强类型的接口定义,减少了编码错误和解析错误。
  • .proto自动生成服务端、客户端代码
  • 语言支持广泛,在里面主要是kotlin、python、C++
  • 双向流通信:实现长连接和实时数据传输
  • 内置SSL/TLS支持
  • 对比于REST:二进制HTTP2优于REST的文本格式和HTTP/1.1
    • 强类型,REST缺乏类型约束
    • 支持流式通信,REST基于请求/响应模型,2.0也是
  • 更适用于对性能和传输效率要求较高的双向通信

SharedFlow和Flow?

  • 对于shardflow来说,有缓冲区,独立于收集器。
  • 对于flow来说,除了collect类似的操作(只有collect才能emit),其他只是定义这个流的行为,而不是真正执行,没有缓冲区,每次收集都是重新去操作。看下面重要代码
  • MutableSharedFlow的三种缓冲策略

websocket也可以实现?

  • 确实websocket也支持长连接的双向通信,服务端也能主动推送消息,也有WAMP框架,基于发布/订阅,但是GPPC性能更高,同时proto支持强类型定义,
  • 实现和维护更复杂,需要处理连接管理、心跳检测、重连这些问题。
  • HTTP2的头部压缩,服务器推送、多路复用,完美契合grpc对于高效通信的需求

Why RockDB?

  • 在流处理和实时分析中,kafka的streams,RocksDB 常用作状态存储,实时存储和更新流数据的处理状态。适合需要高性能、持久化存储和高吞吐量的流处理应用。
  • 提供了键值对操作
  • 支持范围写范围查找,因为提供了迭代器
  • 日志结构合并树 (LSM-Tree)
  • MemTable内存中的一个有序查找表(比如:红黑树),用于缓存最近的写入操作。当MemTable达到一定大小时,其内容会被刷新(flush)到磁盘上的SSTable中。
  • SSTable(Sorted String Table):这是一
好的,我可以为您提供一份简单的Verilog代码来实现一个32位存储器,同时配合一个coe文件进行初始化数据的存储。代码如下: ``` module memory( input clk, input enable, input [31:0] address, input [31:0] data_in, output reg [31:0] data_out ); // 定义存储器数组 reg [31:0] mem[0:1023]; // 定义地址寄存器 reg [9:0] addr_reg; // 时钟上升沿触发 always @(posedge clk) begin if(enable) begin // 地址寄存器赋值 addr_reg <= address[9:0]; // 数据写入存储器 mem[addr_reg] <= data_in; end // 数据读出存储器 data_out <= mem[address[9:0]]; end endmodule ``` 同时,我们可以使用以下的coe文件来初始化存储器中的数据: ``` memory_initialization_radix=16; memory_initialization_vector= 00000000 11111111 22222222 33333333 44444444 55555555 66666666 77777777 88888888 99999999 AAAAAAAA BBBBBBBB CCCCCCCC DDDDDDDD EEEEEEEE FFFFFFFF; ``` coe文件中的数据是16进制格式的,每行表示32位数据。在Verilog中,我们需要使用`$readmemb`指令来读取coe文件中的数据,以初始化存储器。具体代码如下: ``` module memory_test; // 定义测试信号 reg clk; reg enable; reg [31:0] address; reg [31:0] data_in; // 定义被测模块 memory mem(.clk(clk), .enable(enable), .address(address), .data_in(data_in)); // 时钟驱动 initial begin clk = 0; forever #10 clk = ~clk; end // 测试代码 initial begin // 读取coe文件 $readmemb("memory.coe", mem.mem); // 使能信号置1,写入数据到地址0 enable = 1; address = 0; data_in = 0x12345678; #10; // 使能信号置0,读出地址0的数据 enable = 0; #10; $display("Read data: %h", mem.data_out); // 使能信号置1,写入数据到地址1 enable = 1; address = 4; data_in = 0x87654321; #10; // 使能信号置0,读出地址1的数据 enable = 0; #10; $display("Read data: %h", mem.data_out); end endmodule ``` 以上代码中,我们使用了`$readmemb`指令来读取coe文件中的数据,并将其存储到`mem`数组中。在测试代码中,我们先向地址0写入数据,然后再从地址0读出数据。接着,我们向地址1写入数据,再从地址1读出数据。最后,我们使用`$display`指令来显示读出的数据。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值